home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Information / CSMP Digest / volume 3 / csmp-digest-v3-065 < prev    next >
Text File  |  1995-12-31  |  114KB  |  3,237 lines

  1. C.S.M.P. Digest             Fri, 14 Oct 94       Volume 3 : Issue 65
  2.  
  3. Today's Topics:
  4.  
  5.         Books-Reference: opinions needed!!
  6.         Changing to new toolbox routine names with MacPerl
  7.         Cleanest way to turn AppleTalk on-off
  8.         Dialog Edit text> 256 characters
  9.         Fast zeroing on PPC
  10.         Inside Mac on CD-ROM
  11.         Q: Using PPC apps without Shared Libraries?
  12.         Reading STR# resource - Pascal code
  13.  
  14.  
  15.  
  16. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  17. (pottier@clipper.ens.fr).
  18.  
  19. The digest is a collection of article threads from the internet newsgroup
  20. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  21. regularly and want an archive of the discussions.  If you don't know what a
  22. newsgroup is, you probably don't have access to it.  Ask your systems
  23. administrator(s) for details.  If you don't have access to news, you may
  24. still be able to post messages to the group by using a mail server like
  25. anon.penet.fi (mail help@anon.penet.fi for more information).
  26.  
  27. Each issue of the digest contains one or more sets of articles (called
  28. threads), with each set corresponding to a 'discussion' of a particular
  29. subject.  The articles are not edited; all articles included in this digest
  30. are in their original posted form (as received by our news server at
  31. nef.ens.fr).  Article threads are not added to the digest until the last
  32. article added to the thread is at least two weeks old (this is to ensure that
  33. the thread is dead before adding it to the digest).  Article threads that
  34. consist of only one message are generally not included in the digest.
  35.  
  36. The digest is officially distributed by two means, by email and ftp.
  37.  
  38. If you want to receive the digest by mail, send email to listserv@ens.fr
  39. with no subject and one of the following commands as body:
  40.     help                        Sends you a summary of commands
  41.     subscribe csmp-digest Your Name    Adds you to the mailing list
  42.     signoff csmp-digest            Removes you from the list
  43. Once you have subscribed, you will automatically receive each new
  44. issue as it is created.
  45.  
  46. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  47. Questions related to the ftp site should be directed to
  48. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  49. digest are available there.
  50.  
  51. Also, the digests are available to WAIS users.  To search back issues
  52. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  53. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  54.  
  55.  
  56. -------------------------------------------------------
  57.  
  58. >From stone@phoenix.cs.uga.edu (Robert)
  59. Subject: Books-Reference: opinions needed!!
  60. Date: 24 Sep 1994 22:09:29 GMT
  61. Organization: kind of sloppy actually....
  62.  
  63. I need YOUR opinion!  Here are some books that I've heard of, and I want to
  64. know how they rate.  Also, let me know if you have any good suggestions on
  65. where to get them (mail order or otherwise.)  Note that I'm interested in
  66. books for people who know little or nothing about mac programming in general
  67. (but who know something about programming on other platforms.)
  68.  
  69. Inside Macintosh: Overview - worth it or not?  necessary?  What Inside mac
  70. books are absolutely essential for any mac programmer?
  71.  
  72. Power Macintosh Programming Starter Kit (book + CD)  Anyone used it?  Is it
  73. useful for people who have, say, CW gold but no PowerPC?  What is the
  74. "special"
  75. version of MW CodeWarrior included on the CD like?  (i.e. how stripped down?)
  76.  
  77. Other books:  (How suitable for complete neophytes?  How "good" in general?)
  78.  
  79. Think THINK C by Dan Parks Sydow
  80. Macintosh Programming for Dummies by Dan Parks Sydow
  81. The C Programming Primer from Dave Mark
  82. Learn C on the Macintosh by Dave Mark
  83. Learn C++ on the Macintosh by Dave Mark
  84. Symantec C++ Programming for the Macintosh  by ???
  85. How to Write Macintosh Software, Third Edition
  86. "Macintosh Programming Secrets" 2nd edition by ???
  87. Debugging Macintosh Software With MacsBug
  88.  
  89. the Waite Group's C Primer Plus
  90. the Waite Group's C++ Primer (or something like that)
  91. C++ Primer (Addison Wesley)
  92. C++ Programming Language (Addison Wesley)
  93. K&R's The C Programming Language, 2nd Edition.
  94.  
  95.  
  96. Any books I'm missing that might be useful for complete novices?
  97.  
  98. Thanks for your reply.  This info will be very useful to me and many others.
  99. (I may start a "getting started with mac programming FAQ.")
  100.  
  101. @@@@@ Robert Stone (stone@phoenix.cs.uga.edu)
  102. @@@@@ Some Sort of Computer-Related Person, UGA - Extension Dairy Sci.
  103. @@@@@ Windows - n. a software package designed to cure the DOS virus, but
  104.         which proved to be ineffective.  While removing the 640K limit
  105.         symptom, the system performance becomes degraded even further.
  106.             Also increases chance of system crash and consumes additional
  107.         disk space.
  108.  
  109.  
  110. +++++++++++++++++++++++++++
  111.  
  112. >From nick+@pitt.edu ( nick.c )
  113. Date: Sun, 25 Sep 94 01:28:48 GMT
  114. Organization: The Pitt, Chemistry
  115.  
  116. In Article <36282p$n72@hobbes.cc.uga.edu>, stone@phoenix.cs.uga.edu (Robert)
  117. wrote:
  118.  
  119.  
  120. >Inside Macintosh: Overview - worth it or not?  necessary?  What Inside mac
  121. >books are absolutely essential for any mac programmer?
  122.  
  123.     A good introduction to the general structure of the essentials of 
  124.       a mac program.  Read it - once.  Not necessary, but helpfull.
  125.  
  126.     The essential NIM?  Depends on what you're doing.  In general I'd
  127.       say Toolbox, More Toolbox, Imaging with Quickdraw, and Files.
  128.       I found "Text" very usefull, not sure I'd call it essential.
  129.       Some folks say "Memory" is essential, not sure I'd agree.
  130.  
  131. >Power Macintosh Programming Starter Kit (book + CD)  Anyone used it?  Is it
  132. >useful for people who have, say, CW gold but no PowerPC?  What is the
  133. "special"
  134. >version of MW CodeWarrior included on the CD like?  (i.e. how stripped
  135. down?)
  136.  
  137.     A neat book, it discusses some issues unique to the Power Mac that
  138.       I know of no other source for.  It also presents some unique mac
  139.       programming techniques (eg Rez) that are not usually brought up
  140.       in introductory books.  The version of CW included will only allow
  141.       you to open existing projects, not create new ones.  There are 
  142.       example projects on the CD, so you have a fully functional environment
  143.       for learning/evaluating CW - but you won't be able to use it to 
  144.       generate your own projects.  I'd recommend this book to someone
  145.       who wants to familiarize themselves with the CW environment, or
  146.       is considering buying CW, or who has an interest in programming
  147.       for the powermac.  I would not recommend this for someone entirely
  148.       new to mac programming.
  149.  
  150. >Other books:  (How suitable for complete neophytes?  How "good" in general?)
  151. >
  152. >Think THINK C by Dan Parks Sydow
  153.  
  154.     It's been highly recommended on the net, and Dan is a good author,
  155.       but I haven't read it.
  156.  
  157. >Macintosh Programming for Dummies by Dan Parks Sydow
  158. >The C Programming Primer from Dave Mark
  159.  
  160.     A little out of date, but it's what I learned with, and I'd still
  161.       recommend it for someone who knows C but is unfamiliar with
  162.       programming on the mac.  Written in plain old english,
  163.       it presents the concepts and implementation of basic macintosh
  164.       programming techniques such as how to use menus and how to
  165.       manage windows.  It's still very relevant, and extremely well
  166.       written.
  167.  
  168. >Learn C on the Macintosh by Dave Mark
  169.  
  170.     The mac toolbox is a collection of rom "tools" that you use to
  171.       generate many of the common elements of the macintosh interface:
  172.       both it's visible interface and it's "method" for dealing with
  173.       user interactions.  A program is a recipe for getting a job
  174.       done that the computer will read and follow.  You can tell the
  175.       computer to use the "tools" in the rom toolbox as well as other
  176.       actions but you have to tell the computer in a language it'll
  177.       understand.  The most common language for creating these recipes
  178.       on the mac is C.  You have to learn to a language before you
  179.       can do anything else, if you choose to learn C, Dave Mark's book
  180.       is a clear, effective, and well structured introduction to that
  181.       language.  Recommended as the first book you buy to learn macintosh
  182.       programming.
  183.  
  184. >Learn C++ on the Macintosh by Dave Mark
  185.  
  186.     C++ is a superset of C, and should not be the first language you
  187.       learn.  This was one of two books I read when I learned C++,
  188.       and I recommend it, however I'd consider this book the un-official
  189.       "volume 2" to Dave Mark's _Learn C on the Macintosh_.  Learn
  190.       C first, then learn the toolbox.  Program for a while, and when
  191.       you're confident with that this book is a good intro to the joys
  192.       and frustrations of a new *style* of programming called OOP.
  193.       C++, an enhanced version of C, is a good choice to implement 
  194.       that style.
  195.  
  196. >Symantec C++ Programming for the Macintosh  by ???
  197.  
  198.     Eh.  A good introduction to the Symantec environment, and a handy
  199.       reference - but not a must have.  It general learning the compiler
  200.       is the easy part, learning what you can do with it - that's the
  201.       art.
  202.  
  203.     Does re-introduce a lot of C++ concepts, but not the place to learn
  204.       'em.
  205.  
  206. >How to Write Macintosh Software, Third Edition
  207. >"Macintosh Programming Secrets" 2nd edition by ???
  208.  
  209.     A good, *fun* book that includes so many "in-jokes" it's hard
  210.       to read with a straight face.  I don't think this is intended
  211.       as a "first" book on the toolbox, but it's good supplemental
  212.       reading - and a lot of fun to read.
  213.  
  214. >Debugging Macintosh Software With MacsBug
  215. >the Waite Group's C Primer Plus
  216. >the Waite Group's C++ Primer (or something like that)
  217. >C++ Primer (Addison Wesley)
  218. >C++ Programming Language (Addison Wesley)
  219.  
  220.     As close to the definitive reference on C++ as exists.  As I said
  221.       above, don't start to C++, but when you want to learn C++ this is
  222.       a must have.  Reads like stereo instructions, but an essential
  223.       *reference*.
  224.  
  225. >K&R's The C Programming Language, 2nd Edition.
  226.  
  227.     The classic.  If you program in C, you have this book.  I wouldn't
  228.       learn C from it, but I wouldn't learn C without it.
  229.  
  230. >Any books I'm missing that might be useful for complete novices?
  231. >
  232. >Thanks for your reply.  This info will be very useful to me and many others.
  233. >(I may start a "getting started with mac programming FAQ.")
  234.  
  235.     Overdue, please do.
  236.  
  237.                                                 -- nick
  238.  
  239.  
  240.  
  241.                                     _/   _/  _/  _/_/_/   _/   _/  
  242.      Interet: nick@pitt.edu        _/_/ _/  _/  _/   _/  _/_/_/    
  243.       eWorld: nick                _/ _/_/  _/  _/       _/ _/      
  244.          CIS: 71232,766          _/   _/  _/   _/_/_/  _/   _/     
  245.  
  246.  
  247. +++++++++++++++++++++++++++
  248.  
  249. >From thundero@news.delphi.com (THUNDERONE@DELPHI.COM)
  250. Date: 25 Sep 1994 03:43:25 -0000
  251. Organization: Delphi Internet Services Corporation
  252.  
  253. nick+@pitt.edu ( nick.c ) writes:
  254.  
  255. >In Article <36282p$n72@hobbes.cc.uga.edu>, stone@phoenix.cs.uga.edu (Robert)
  256. >wrote:
  257. [snip]
  258.  
  259. >>Learn C on the Macintosh by Dave Mark
  260.  
  261. [explaination of mac programming paradigm deleted]
  262. >      on the mac is C.  You have to learn to a language before you
  263. >      can do anything else, if you choose to learn C, Dave Mark's book
  264. >      is a clear, effective, and well structured introduction to that
  265. >      language.  Recommended as the first book you buy to learn macintosh
  266. >      programming.
  267.  
  268. >>Learn C++ on the Macintosh by Dave Mark
  269.  
  270. >    C++ is a superset of C, and should not be the first language you
  271. >      learn.  This was one of two books I read when I learned C++,
  272. >      and I recommend it, however I'd consider this book the un-official
  273. >      "volume 2" to Dave Mark's _Learn C on the Macintosh_.  Learn
  274. >      C first, then learn the toolbox.  Program for a while, and when
  275. >      you're confident with that this book is a good intro to the joys
  276. >      and frustrations of a new *style* of programming called OOP.
  277. >      C++, an enhanced version of C, is a good choice to implement 
  278. >      that style.
  279.  
  280. [rest deleted]
  281.  
  282. I disagree.  There are much better books that assume no 
  283. platform-specifics which are better introductions to C and C++ as 
  284. languges.  Dave Mark's Learn C/++ on the Mac books are an incredible 
  285. waste of trees.
  286.  
  287. 1.  They only teach you the very basics of the languges.  
  288. Platform-null books go into much greater detail.
  289.  
  290. 2.  He doesn't know how to program effective C++ (or didn't at the 
  291. time he wrote the book).
  292.  
  293. 3.  Both of these books are specific to programming DOS/Unix boxes 
  294. using Think C.  I repeat: there are much better books for this 
  295. purpose.
  296.  
  297. Such as:
  298. C++ Inside Out
  299. The Waite Group's stuff
  300. Teach Yourself C++ by Al Stevens
  301.  
  302. I think almost any C/C++ book that is platform-null will do the job 
  303. well.
  304.  
  305. ........................................................................
  306. Chris Thomas, thunderone@delphi.com, Project KillThinkRef @ Echo Software
  307.  
  308. +++++++++++++++++++++++++++
  309.  
  310. >From afcsusan@aol.com (AFC Susan)
  311. Date: 25 Sep 1994 04:17:02 -0400
  312. Organization: America Online, Inc. (1-800-827-6364)
  313.  
  314. Re article <nick+.1130844168C@usenet.pitt.edu>, nick+@pitt.edu ( nick.c ):
  315.  
  316.   Thank you for your thorough response. Sorry I must disagree on
  317.   these two books.
  318.  
  319. > > Learn C on the Macintosh by Dave Mark ...You have to learn to a
  320. > language before you can do anything else, if you choose to learn
  321. > C, Dave Mark's book is a clear, effective, and well structured
  322. > introduction to that language.  Recommended as the first book you
  323. > buy to learn macintosh programming....
  324.  
  325.   This book has the surface appearance of a new wonder drug, touted
  326.   as containing the C language, a compiler, reference material, a
  327.   glossary, and programming examples. Too bad people fall for slick
  328.   packaging. It is really sad to see a discipline accepting of such
  329.   nonsense, when a rock solid foundation is needed instead.
  330.  
  331. > > Learn C++ on the Macintosh by Dave Mark... C++ is a superset of
  332. > C, and should not be the first language you learn.  This was one
  333. > of two books I read when I learned C++, and I recommend it,
  334. > however I'd consider this book the un-official "volume 2" to Dave
  335. > Mark's _Learn C on the Macintosh_.  Learn C first, then learn the
  336. > toolbox....
  337.  
  338.   Pardon the paraphrase. As a much brighter brain than mine said
  339.   regarding plummeting educational standards in the USA, in
  340.   Doonesbury, "Maybe we could call ourselves Programming High School
  341.   and get away with it."
  342.   
  343.   Something tells me that continued recommendation of Mr. Mark's
  344.   books, which is apparently based on his Primer fame, in
  345.   professional circles like c.s.m.p is an emergency that just won't
  346.   go away.
  347.  
  348. Susan Lesch (AFC Susan)
  349. Forum Consultant, Macintosh Utilities Forum
  350. America Online, Inc.
  351.  
  352.   Speaking only for myself and my colleagues. "You be me for a
  353.   while. And I'll be you." --Paul Westerberg, and The Replacements,
  354.   circa 1989.
  355.  
  356. +++++++++++++++++++++++++++
  357.  
  358. >From Gilles Dignard <gdignard@hookup.net>
  359. Date: 25 Sep 1994 13:40:34 GMT
  360. Organization: HookUp Communication Corporation, Oakville, Ontario, CANADA
  361.  
  362. In article <36282p$n72@hobbes.cc.uga.edu> Robert,
  363. stone@phoenix.cs.uga.edu writes:
  364. >Any books I'm missing that might be useful for complete novices?
  365.  
  366. Actually, your list is missing the two I consider were the most helpful
  367. to me learning C++. Neither is Macintosh specific, though.
  368.  
  369. The first is essentially a textbook. It is "Classic Data Structures in
  370. C++" by Timothy A. Budd, published by Addison Wesley, ISBN 0-201-50889-3.
  371. What I found particularly useful were the numerous code snippets and
  372. source to a large number of important classes that are included (Linked
  373. lists, string classes, vectors, queues, matrices, etc.). Most
  374. importantly, it isn't just a cookbook of classes, however. The classes
  375. are discussed in detail, and while it may or may not be something new,
  376. what the classes represent in a more general computational sense is also
  377. discussed.
  378.  
  379. Once you get your feet wet, and want to know how to best use your
  380. new-found C++ abilities, the book to get is "Effective C++ / 50 Specific
  381. Ways to Improve Your Programs and Designs" by Scott Meyers, published by
  382. Addison-Wesley, ISBN 0-201-56364-9. One of the best "programming" books
  383. I've ever run across. A must-have for all C++ programmers.
  384.  
  385. - --------------------
  386. ####      /\      ####  Gilles Dignard - gdignard@hookup.net
  387. ####  ]\/\  /\/[  ####
  388. ####  \ \    / /  ####  The human mind treats a new idea the way the
  389. ####  /--------\  ####  body treats a strange protein; it rejects it.
  390. ####      ][      ####                   - P.B. Medawar
  391. - --------------------
  392.  
  393. +++++++++++++++++++++++++++
  394.  
  395. >From howard@netcom.com (Howard Berkey)
  396. Date: Sun, 25 Sep 1994 20:53:18 GMT
  397. Organization: Psychonaut Foundation
  398.  
  399. In article <nick+.1130844168C@usenet.pitt.edu>, nick+@pitt.edu ( nick.c )
  400. wrote:
  401.  
  402. > >Debugging Macintosh Software With MacsBug
  403. > >the Waite Group's C Primer Plus
  404. > >the Waite Group's C++ Primer (or something like that)
  405. > >C++ Primer (Addison Wesley)
  406. > >C++ Programming Language (Addison Wesley)
  407. >     As close to the definitive reference on C++ as exists.  As I said
  408. >       above, don't start to C++, but when you want to learn C++ this is
  409. >       a must have.  Reads like stereo instructions, but an essential
  410. >       *reference*.
  411.  
  412. ARM.  ARM.  ARM.   Must have.
  413.  
  414. (until I can get the ANSI standard, that is :-)
  415.  
  416. Really, the Annotated Reference Manual is as close to definitive as it gets 
  417. for C++, at least as a target for current compilers, which is what is
  418. really important unless you can head-compile your code and speak in
  419. assembler :-)
  420.  
  421. >
  422. > >Thanks for your reply.  This info will be very useful to me and many
  423. others.
  424. > >(I may start a "getting started with mac programming FAQ.")
  425. >     Overdue, please do.
  426.  
  427.  
  428. Jon's is a good start at least...  you might check it out, he posts it
  429. here regularly.
  430.  
  431. -H-
  432.  
  433. -- 
  434. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  435. Howard Berkey                                     howard@netcom.com
  436. Segmentation Fault (core dumped)
  437.  
  438. +++++++++++++++++++++++++++
  439.  
  440. >From h+@nada.kth.se (Jon W{tte)
  441. Date: Mon, 26 Sep 1994 19:29:02 +0100
  442. Organization: Royal Institute of Something or other
  443.  
  444. In article <363uki$rap@relay.tor.hookup.net>,
  445. Gilles Dignard <gdignard@hookup.net> wrote:
  446.  
  447. >Once you get your feet wet, and want to know how to best use your
  448. >new-found C++ abilities, the book to get is "Effective C++ / 50 Specific
  449. >Ways to Improve Your Programs and Designs" by Scott Meyers, published by
  450.  
  451. May I pop in with a recommendation for "Writing Solid Code" by 
  452. Steve Maguire? Once you've gotten through your first C or C++ 
  453. or even Pascal book, this book will teach you lots of good 
  454. habits which will help you a LOT. It also goes through known 
  455. problem areas, especially when writing C code, and tells you 
  456. what you can do about it.
  457.  
  458. Or maybe I should keep quiet about it and treat it as a secret 
  459. corporate advantage? :-)
  460.  
  461. Cheers,
  462.  
  463.                 / h+
  464.  
  465.  
  466. --
  467.   Jon W$E4tte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  468.   "Psychotherapist" - "Psycho-The-Rapist"
  469.    Pure coincidence? You decide!
  470.  
  471.  
  472. +++++++++++++++++++++++++++
  473.  
  474. >From garyg@oak.circa.ufl.edu (gary greenberg)
  475. Date: 26 Sep 1994 01:39:36 GMT
  476. Organization: Center for Instructional and Research Computing Activities
  477.  
  478. In article <36282p$n72@hobbes.cc.uga.edu>, stone@phoenix.cs.uga.edu (Robert)
  479. writes:
  480. >I need YOUR opinion!  
  481.     [massive snip]
  482. >Any books I'm missing that might be useful for complete novices?
  483. >
  484. >Thanks for your reply.  This info will be very useful to me and many others.
  485. >(I may start a "getting started with mac programming FAQ.")
  486. >
  487. >@@@@@ Robert Stone (stone@phoenix.cs.uga.edu)
  488.  
  489. Here's advice from a _true neophyte_ fwiw,
  490. In the last few months, I've spent a good deal of time in the books.
  491. I've started at the ANSI C level 'cause I need it for work, and I'm
  492. teaching myself for fun. I've read several Smalltalk books, some UNIX C,
  493. and am working my way thru several Mac Programming books. Rather than
  494. offer specific comments about any single book compared to another, I'll
  495. post the following note cause I think *everyone* reading this list will
  496. want the information included. There is an online source to these books;
  497. several actually. Addison Wesley has an online Gopher, and probably a
  498. WWW. O'Reilly and Associates does also. I don't have the A/W handy, but
  499. O'Reilly is at nuts@ora.com for general questions (they do the *great*
  500. Nutshell books -- I just finished their VI book and its A++). To
  501. get their catalog, send mail to catalog@ora.com, and to get info about
  502. their gopher send to gopher@ora.com. Now, ...
  503. for more Mac Specific books & everything else ...
  504.     ____ begin included ______________
  505. From:   MX%"books@softproeast.com" 22-SEP-1994 17:51:03.62
  506. To:     me
  507. Subj:   Softpro Internet Resources
  508.  
  509. [snip header; increase other's reading pleasure ;-) ]
  510.  
  511. ===============================================================
  512.  ... Below you will find additional information for
  513. accessing our on-line resources such as our Gopher and Mosaic
  514. Catalog services.
  515. If you have any additional questions, feel free to e-mail, write,
  516.  fax, or give us a call.
  517.  
  518. David Vins
  519. Softpro
  520. ==================================================================
  521. Softpro offers both on-line Gopher and World Wide Web/Mosaic services
  522. complete with browse, search, and on-line order capabilities.
  523. Our booklist is also availble via FTP.  To access these services,
  524. follow the information provided below.
  525.  
  526.          FTP: -> Anonymous ftp to "ftp.std.com"
  527.               -> Our booklist can be obtained as the following...
  528.                  "customers/books/Softpro/booklist"
  529.  
  530.       Gopher: -> "gopher storefront.xor.com"
  531.               -> Select the "Softpro Books" menu item.
  532.  
  533.   WWW/Mosaic: -> "xmosaic http://storefront.xor.com"
  534.               -> Select the "Softpro Books" menu item.
  535.  
  536.               -> Mosaic for Windows/Mac users please note, our URL
  537.                  (Universal Resource Locator) for Softpro is
  538.                  "http://storefront.xor.com/"
  539. ================================================================
  540.  
  541. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  542. - Softpro Books & Software                                      -=-
  543. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =
  544.   - 112 Burlington Mall Rd.         Hours:  Mon-Fri   9am to 8pm  -
  545.   = Burlington, MA 01803-5300              Saturday  10am to 6pm  =
  546.   -                                          Sunday  12pm to 5pm  -
  547.   =  Sales: +1.617.273.2919                                       =
  548.   -    Fax: +1.617.273.2499                                       -
  549. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= =
  550. -     E-Mail -> books@softproeast.com                           -=-
  551. = WWW/Mosaic -> http://storefront.xor.com                         =
  552. -     Gopher -> gopher storefront.xor.com                         -
  553. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  554. __________________ End Included ____________________
  555. The folks at SoftPro have it all; books on C, C++, LISP, Smalltalk,
  556. UNIX, Windoze, whatever & the description of many books is also
  557. on line -- lots of the FAQ is there for the _including_.
  558. For ANSI C stuff, there are also online training courses avaliable,
  559. go to rtfm at mit, look in the Usenet FAQs for comp.lang.c and
  560. comp.lang.c++ -- they also include and rate books that are 
  561. basically platform independent. Of course, to really code on the
  562. Mac you'll still need the Toolbox books at a minimum.
  563.  
  564. Well, I've already told you more than I know, but hey ...
  565. at this price it's a good deal ;-)
  566. Cheers,
  567. Gary
  568.  
  569. +++++++++++++++++++++++++++
  570.  
  571. >From tblanch@lookout (Todd Blanchard)
  572. Date: Mon, 26 Sep 1994 15:56:48 GMT
  573. Organization: US WEST Information Technologies
  574.  
  575. Robert (stone@phoenix.cs.uga.edu) wrote:
  576. : I need YOUR opinion!  Here are some books that I've heard of, and I want to
  577. : know how they rate.  Also, let me know if you have any good suggestions on
  578. : where to get them (mail order or otherwise.)  Note that I'm interested in
  579. : books for people who know little or nothing about mac programming in
  580. general
  581. : (but who know something about programming on other platforms.)
  582.  
  583. I rely on the following pretty heavily:
  584.  
  585. The Annotated C++ Reference Manual (ARM) Ellis & Stroustrup
  586. Effective C++, Scott Meyers - (Awesome book!)
  587. C++ IOStreams Handbook, Teale
  588. The C Programming Language, K&R
  589. Think Ref, Mac online refernce from Symantec.
  590.  
  591. Apart from the last one, these are more general C++ references rather
  592. than Mac-specific. I'll leave the Mac stuff to those who actually do
  593. Macs for a living (I play for fun).
  594.  
  595. Todd Blanchard
  596.  
  597. ---------------------------
  598.  
  599. >From hecht@vnet.net (Michael Hecht)
  600. Subject: Changing to new toolbox routine names with MacPerl
  601. Date: 25 Sep 1994 06:41:58 GMT
  602. Organization: Vnet Internet Access, Charlotte, NC -  info@char.vnet.net
  603.  
  604. The new Universal Headers rename many (~135) of the existing toolbox
  605. routines as part of the switch from a trap-based system to a code fragment
  606. system. For example, DisposHandle is now DisposeHandle. Apple suggests
  607. that you change your code to use the new names. Currently, they provide
  608. #defines to map the old name to the new one, but they claimed at the WWDC
  609. that the #defines will go away eventually.
  610.  
  611. Those of you with MPW can use its canon tool to change the toolbox
  612. routines in all your source code easily. Those of you (like me) without
  613. MPW or canon can do the job using the MacPerl scripts I wrote.
  614.  
  615. The first script searches the Universal Headers for #defines that look
  616. like old-->new name mappings. I included it for your edification--you
  617. don't need to actually run it. The second script applies the changes (read
  618. from the end of the script) to a group of .c files. Someone could probably
  619. turn this one into a MacPerl droplet if they were so inclined.
  620.  
  621. Anyway, here they are.
  622. --Michael
  623.  
  624. ============= begin "mkcanon.pl"
  625. # This is the directory where the Universal Headers live on my Mac
  626. $syshdir = 'Wynonna:Development:Symantec C++ for Macintosh:Mac
  627. #includes:Universal Headers:';
  628.  
  629. # Get a list of all Universal Header files
  630. opendir( SYSHDIR, $syshdir ) || die;
  631. @sysh = grep( /\.h$/, readdir( SYSHDIR ));
  632. closedir( SYSHDIR );
  633.  
  634. # For each header file
  635. foreach $sysh ( @sysh ) {
  636.  
  637.    # Read the header file
  638.    open( SYSH, "<$syshdir$sysh" ) || die;
  639.    while( <SYSH> ) {
  640.  
  641.       # Look for #defines with parameters
  642.       next unless /^#define \w+\(/;
  643.  
  644.       # Read in multiline #defines
  645.       $_ = $` . <SYSH> while /\\\n$/;
  646.  
  647.       # Look for #defines that simply rename a function call
  648.       next unless /^#define (\w+)(\([^)]*\)) (\w+)\2/;
  649.  
  650.       # Get old & new names
  651.       ( $old, $new ) = ( $1, $3 );
  652.  
  653.       # The "IU" routines are confused in <TextUtils.h>    Apple?
  654.       ( $new, $old ) = ( $old, $new ) if $new =~ /^IU/i;
  655.  
  656.       print "$old --> $new\n";
  657.    }
  658.    close( SYSH );
  659. }
  660. ============= end "mkcanon.pl"
  661.  
  662. ============= begin "canon.pl"
  663. # This is the directory of source code to be changed
  664. $projdir = 'Wynonna:MyProject:';
  665.  
  666. # This is the directory that the changed files will be written to
  667. $outdir  = 'Wynonna:MyProject Out:';
  668.  
  669. # Unbuffer STDOUT
  670. $| = 1;
  671.  
  672. # Initialize substitution command string
  673. $s = "";
  674. $npairs = 0;
  675.  
  676. print "\nReading mapping pairs... ";
  677.  
  678. # Read mapping pairs
  679. while( <DATA> ) {
  680.  
  681.    # Split up this mapping pair
  682.    chop;
  683.    ( $old, $new ) = split( / --> / );
  684.  
  685.    # Append substitution command to string
  686.    $s .= "\$n = s/\\b$old\\b/$new/g; \$canon{ '$_' } += \$n if \$n;\n";
  687.  
  688.    # Count pairs
  689.    $npairs++;
  690. }
  691.  
  692. print "$npairs\n";
  693.  
  694. # Uncomment next line to see what kind of code we're generating
  695. #print $s;
  696.  
  697. # Get a list of all the source files in the project directory
  698. opendir( PROJDIR, $projdir ) || die;
  699. @proj = grep( /\.cp{0,2}$/, readdir( PROJDIR ));
  700. closedir( PROJDIR );
  701.  
  702. # Read entire file at once rather than line-by-line
  703. undef $/;
  704. $* = 1;
  705.  
  706. # Go through the list of files
  707. foreach $proj ( @proj ) {
  708.  
  709.    # Read this file
  710.    open( PROJ, "<$projdir$proj" ) || die;
  711.    ( $fcreator, $ftype ) = &MacPerl'GetFileInfo( "$projdir$proj" );
  712.    $_ = <PROJ>;
  713.    close( PROJ );
  714.  
  715.    # Reset our count of substitutions made, and perform all substitutions
  716.    undef %canon;
  717.    eval $s;
  718.  
  719.    # Continue if no changes were made
  720.    next unless %canon;
  721.  
  722.    # Log the changes
  723.    print "\n$proj:\n";
  724.    foreach $change ( sort keys %canon ) {
  725.       print "$change: $canon{$change}\n";
  726.    }
  727.  
  728.    # Uncomment next line to skip writing the changed file
  729. #   next;
  730.  
  731.    # Write the file
  732.    open( PROJ, ">$outdir$proj" ) || die;
  733.    &MacPerl'SetFileInfo( $fcreator, $ftype, "$outdir$proj" );
  734.    print PROJ;
  735.    close( PROJ );
  736. }
  737.  
  738. __END__
  739. SetCTitle --> SetControlTitle
  740. GetCTitle --> GetControlTitle
  741. UpdtControl --> UpdateControls
  742. SetCtlValue --> SetControlValue
  743. GetCtlValue --> GetControlValue
  744. SetCtlMin --> SetControlMinimum
  745. GetCtlMin --> GetControlMinimum
  746. SetCtlMax --> SetControlMaximum
  747. GetCtlMax --> GetControlMaximum
  748. SetCRefCon --> SetControlReference
  749. GetCRefCon --> GetControlReference
  750. SetCtlAction --> SetControlAction
  751. GetCtlAction --> GetControlAction
  752. SetCtlColor --> SetControlColor
  753. GetAuxCtl --> GetAuxiliaryControlRecord
  754. GetCVariant --> GetControlVariant
  755. getctitle --> getcontroltitle
  756. setctitle --> setcontroltitle
  757. DisposDialog --> DisposeDialog
  758. UpdtDialog --> UpdateDialog
  759. GetDItem --> GetDialogItem
  760. SetDItem --> SetDialogItem
  761. HideDItem --> HideDialogItem
  762. ShowDItem --> ShowDialogItem
  763. SelIText --> SelectDialogItemText
  764. GetIText --> GetDialogItemText
  765. SetIText --> SetDialogItemText
  766. FindDItem --> FindDialogItem
  767. GetAlrtStage --> GetAlertStage
  768. ResetAlrtStage --> ResetAlertStage
  769. DlgCut --> DialogCut
  770. DlgPaste --> DialogPaste
  771. DlgCopy --> DialogCopy
  772. DlgDelete --> DialogDelete
  773. SetDAFont --> SetDialogFont
  774. getitext --> getdialogitemtext
  775. setitext --> setdialogitemtext
  776. findditem --> finddialogitem
  777. KeyTrans --> KeyTranslate
  778. LDoDraw --> LSetDrawingMode
  779. LFind --> LGetCellDataLocation
  780. lfind --> lgetcelldatalocation
  781. ApplicZone --> ApplicationZone
  782. MFTempNewHandle --> TempNewHandle
  783. MFMaxMem --> TempMaxMem
  784. MFFreeMem --> TempFreeMem
  785. MFTempHLock --> TempHLock
  786. MFTempHUnlock --> TempHUnlock
  787. MFTempDisposHandle --> TempDisposeHandle
  788. MFTopMem --> TempTopMem
  789. ResrvMem --> ReserveMem
  790. DisposPtr --> DisposePtr
  791. DisposHandle --> DisposeHandle
  792. ReallocHandle --> ReallocateHandle
  793. AddResMenu --> AppendResMenu
  794. InsMenuItem --> InsertMenuItem
  795. DelMenuItem --> DeleteMenuItem
  796. SetItem --> SetMenuItemText
  797. GetItem --> GetMenuItemText
  798. GetMHandle --> GetMenuHandle
  799. DelMCEntries --> DeleteMCEntries
  800. DispMCInfo --> DisposeMCInfo
  801. addresmenu --> appendresmenu
  802. getitem --> getmenuitemtext
  803. setitem --> setmenuitemtext
  804. insmenuitem --> insertmenuitem
  805. OSAComponentFunctionInline --> ComponentCallNow
  806. LongDate2Secs --> LongDateToSeconds
  807. LongSecs2Date --> LongSecondsToDate
  808. IUMetric --> IsMetric
  809. Date2Secs --> DateToSeconds
  810. Secs2Date --> SecondsToDate
  811. DisposPictInfo --> DisposePictInfo
  812. DisposPixMap --> DisposePixMap
  813. DisposPixPat --> DisposePixPat
  814. DisposCTable --> DisposeCTable
  815. DisposCCursor --> DisposeCCursor
  816. DisposCIcon --> DisposeCIcon
  817. DisposGDevice --> DisposeGDevice
  818. NDrawJust --> DrawJustified
  819. NMeasureJust --> MeasureJustified
  820. NPortionText --> PortionLine
  821. SizeResource --> GetResourceSizeOnDisk
  822. MaxSizeRsrc --> GetMaxResourceSize
  823. RmveResource --> RemoveResource
  824. SetSysJust --> SetSysDirection
  825. GetSysJust --> GetSysDirection
  826. Font2Script --> FontToScript
  827. GetEnvirons --> GetScriptManagerVariable
  828. SetEnvirons --> SetScriptManagerVariable
  829. IUGetIntl --> GetIntlResource
  830. IUSetIntl --> SetIntlResource
  831. IUClearCache --> ClearIntlResourceCache
  832. IUGetItlTable --> GetIntlResourceTable
  833. TESetJust --> TESetAlignment
  834. TextBox --> TETextBox
  835. TEStylNew --> TEStyleNew
  836. SetStylHandle --> TESetStyleHandle
  837. GetStylHandle --> TEGetStyleHandle
  838. GetStyleHandle --> TEGetStyleHandle
  839. TEStylPaste --> TEStylePaste
  840. GetStylScrap --> TEGetStyleScrapHandle
  841. GetStyleScrap --> TEGetStyleScrapHandle
  842. SetStylScrap --> TEUseStyleScrap
  843. SetStyleScrap --> TEUseStyleScrap
  844. TEStylInsert --> TEStyleInsert
  845. TESetScrapLen --> TESetScrapLength
  846. TEGetScrapLen --> TEGetScrapLength
  847. SetClikLoop --> TESetClickLoop
  848. SetWordBreak --> TESetWordBreak
  849. IULDateString --> LongDateString
  850. iuldatestring --> longdatestring
  851. IULDateString --> LongTimeString
  852. iultimestring --> longtimestring
  853. String2Date --> StringToDate
  854. String2Time --> StringToTime
  855. UprString --> UpperString
  856. uprstring --> upperstring
  857. IUCompPString --> CompareString
  858. iucomppstring --> comparestring
  859. IUMagPString --> CompareText
  860. IUMagIDPString --> IdenticalText
  861. IUEqualPString --> IdenticalString
  862. iuequalpstring --> identicalstring
  863. IULangOrder --> LanguageOrder
  864. IUTextOrder --> TextOrder
  865. IUStringOrder --> StringOrder
  866. Str2Format --> StringToFormatRec
  867. Format2Str --> FormatRecToString
  868. FormatX2Str --> ExtendedToString
  869. FormatStr2X --> StringToExtended
  870. IUDatePString --> DateString
  871. iudatepstring --> datestring
  872. IUTimePString --> TimeString
  873. iutimepstring --> timestring
  874. ============= end "canon.pl"
  875.  
  876. +++++++++++++++++++++++++++
  877.  
  878. >From neeri@iis.ee.ethz.ch (Matthias Neeracher)
  879. Date: 25 Sep 1994 12:26:08 GMT
  880. Organization: Swiss Federal Institute of Technology (ETHZ)
  881.  
  882. hecht@vnet.net (Michael Hecht) writes:
  883. >Those of you with MPW can use its canon tool to change the toolbox
  884. >routines in all your source code easily. Those of you (like me) without
  885. >MPW or canon can do the job using the MacPerl scripts I wrote.
  886.  
  887. K001. Hope you don't mind me borrowing these for my MacPerl hall of fame?
  888.  
  889. >============= begin "mkcanon.pl"
  890. ># This is the directory where the Universal Headers live on my Mac
  891. >$syshdir = 'Wynonna:Development:Symantec C++ for Macintosh:Mac
  892. >#includes:Universal Headers:';
  893.  
  894. For those taking the script out of this article & try to run it:
  895. The above two lines are in fact one long word wrapped line.
  896.  
  897. Matthias
  898.  
  899. - ---
  900. Matthias Neeracher <neeri@iis.ee.ethz.ch>
  901. http://err.ethz.ch/members/neeri.html
  902.   "And that's why I am going to turn this world upside down, and make
  903.    of it a fire so *bright* that someone real will notice"
  904.                                 -- Vernor Vinge, _Tatja Grimm's World_
  905.  
  906. ---------------------------
  907.  
  908. >From mars@netcom.com (Darren Giles)
  909. Subject: Cleanest way to turn AppleTalk on-off
  910. Date: Thu, 15 Sep 1994 08:04:28 GMT
  911. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  912.  
  913.  
  914. What is the cleanest way to turn AppleTalk on & off?  I've used MPPOpen and
  915. MPPClose with some success in the past, but it's no longer in the universal
  916. headers.  There's a mention of using OpenDriver in IM, but I'm a little
  917. leery of using it without more info than given.
  918.  
  919. Basically, what I'm trying to do is simulate clicking on the "AppleTalk
  920. on/off"
  921. buttons in the Chooser.  Has anyone done this?
  922.  
  923. - Darren
  924.  
  925. <Std. Disclaimer>  I know this is not something that should "normally" be
  926. done.
  927. I'm working on an embedded application, where the user will never even see
  928. the
  929. screen... so "normal" doesn't seem to apply.
  930.  
  931. +++++++++++++++++++++++++++
  932.  
  933. >From mars@netcom.com (Darren Giles)
  934. Date: Mon, 26 Sep 1994 02:27:06 GMT
  935. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  936.  
  937. In article <marsCw5vrG.JtM@netcom.com>, I asked:
  938. >
  939. >What is the cleanest way to turn AppleTalk on & off?
  940. >
  941. >Basically, what I'm trying to do is simulate clicking on the "AppleTalk
  942. on/off"
  943. >buttons in the Chooser.  Has anyone done this?
  944.  
  945. I got answers from several people, request for the info from several others.
  946. Here's the code I'm now using, which works great:
  947.  
  948. //////////////////////////////////////////////////////////////////////////////
  949. //
  950. //    Must reboot after an off -> on transition for change to take effect
  951. //////////////////////////////////////////////////////////////////////////////
  952. //
  953. void cdev_atalk_on (void) {
  954.     LMSetSPConfig (useATalk);
  955. }
  956.  
  957.  
  958. //////////////////////////////////////////////////////////////////////////////
  959. //
  960. void cdev_atalk_off (void) {
  961.     LMSetSPConfig (useAsync);
  962. }
  963.  
  964.  
  965.  
  966.  
  967. ---------------------------
  968.  
  969. >From startz@u.washington.edu (Dick Startz)
  970. Subject: Dialog Edit text> 256 characters
  971. Date: Thu, 22 Sep 1994 08:45:43 +0800
  972. Organization: University of Washington
  973.  
  974. I have a desparate need to display very long edit text items in dialogs.
  975. Can anyone suggest a kludge to let me do this? BTW, sometimes I have more
  976. than one per dialog.
  977.  
  978. Thanks to all.
  979. -Dick Startz
  980.  
  981. +++++++++++++++++++++++++++
  982.  
  983. >From rmah@panix.com (Robert Mah)
  984. Date: Thu, 22 Sep 1994 15:47:54 -0500
  985. Organization: One Step Beyond
  986.  
  987. startz@u.washington.edu (Dick Startz) wrote:
  988.  
  989. ) I have a desparate need to display very long edit text items in dialogs.
  990. ) Can anyone suggest a kludge to let me do this? BTW, sometimes I have
  991. ) more than one per dialog.
  992.  
  993. I just answered this in another post yesterday (complete with untested
  994. sample code).  I'm afraid I can't remember the subject line, but it was
  995. similar to yours.
  996.  
  997. Cheers,
  998. Rob
  999. _____________________________________________________________________
  1000. Robert S. Mah           Software Development          +1.212.947.6507
  1001. One Step Beyond        and Network Consulting          rmah@panix.com
  1002.  
  1003. +++++++++++++++++++++++++++
  1004.  
  1005. >From peter.lewis@info.curtin.edu.au (Peter N Lewis)
  1006. Date: Fri, 23 Sep 1994 10:39:58 +0800
  1007. Organization: NCRPDA, Curtin University
  1008.  
  1009. In article <startz-2209940845440001@128.95.72.95>, startz@u.washington.edu
  1010. (Dick Startz) wrote:
  1011.  
  1012. >I have a desparate need to display very long edit text items in dialogs.
  1013. >Can anyone suggest a kludge to let me do this? BTW, sometimes I have more
  1014. >than one per dialog.
  1015.  
  1016. Just write a dialog user item proc, and use TextBox (or better yet, use
  1017. NeoTextBox as described in develop a few issues back (16?)).
  1018.    Peter.
  1019. -- 
  1020. Peter N Lewis <peter.lewis@info.curtin.edu.au> - Macintosh TCP fingerpainter
  1021. FTP my programs from redback.cs.uwa.edu.au:Others/PeterLewis/ or
  1022. amug.org:pub/peterlewis/ or nic.switch.ch:software/mac/peterlewis/
  1023.  
  1024. +++++++++++++++++++++++++++
  1025.  
  1026. >From fyock@mathworks.com (Lee Fyock)
  1027. Date: Fri, 23 Sep 1994 10:23:59 -0400
  1028. Organization: The MathWorks, Inc.
  1029.  
  1030. In article <peter.lewis-2309941039580001@rocky.curtin.edu.au>,
  1031. peter.lewis@info.curtin.edu.au (Peter N Lewis) wrote:
  1032.  
  1033. > In article <startz-2209940845440001@128.95.72.95>, startz@u.washington.edu
  1034. > (Dick Startz) wrote:
  1035. > >I have a desparate need to display very long edit text items in dialogs.
  1036. > >Can anyone suggest a kludge to let me do this? BTW, sometimes I have more
  1037. > >than one per dialog.
  1038. > Just write a dialog user item proc, and use TextBox (or better yet, use
  1039. > NeoTextBox as described in develop a few issues back (16?)).
  1040.  
  1041. This is too tough.  Just get the TEHandle associated with the dialog item,
  1042. and set the hText to whatever you'd like.  The Dialog Manager does fine at
  1043. displaying the item and editing it.
  1044.  
  1045. To set it up, do like so:
  1046.  
  1047.    dlogPtr = GetNewDialog(DISPLAY_DLOG, nil, (WindowPtr) -1);
  1048.    SetPort(dlogPtr);
  1049.  
  1050.    GetDItem(dlogPtr,TEXT_ITEM,&iType,&iHandle,&iRect);
  1051.  
  1052.    teH = ((DialogPeek) dlogPtr)->textH;
  1053.  
  1054.    // textH contains the >255 character text to put into the dialog
  1055.    SetHandleSize((**teH).hText, 0);
  1056.    HLock(textH);
  1057.    err = HandAndHand(textH, (**teH).hText);
  1058.    HUnlock(textH);
  1059.    TECalText(teH);
  1060.  
  1061. The "GetDItem" is necessary to get the Dialog Manager to actually load the
  1062. dialog and set it up...  You may need to add some stuff for more than one
  1063. text item in the dialog, since the dialog has only one TextEdit record
  1064. that is switched between the text items.
  1065.  
  1066. Getting the data back out is similar and is left as an exercise to the
  1067. reader.
  1068.  
  1069. Have fun!
  1070. Lee
  1071.  
  1072.  
  1073. - ------------------------------------------------------------------
  1074. Lee Fyock                                    "I think I would remain
  1075. fyock@mathworks.com                                perfectly still."
  1076.  
  1077. +++++++++++++++++++++++++++
  1078.  
  1079. >From gurgle@dnai.com (Pete Gontier)
  1080. Date: Sat, 24 Sep 1994 10:19:35 -0800
  1081. Organization: Integer Poet Software
  1082.  
  1083. In article <startz-2209940845440001@128.95.72.95>, startz@u.washington.edu
  1084. (Dick Startz) wrote:
  1085.  
  1086. > I have a desparate need to display very long edit text items in dialogs.
  1087. > Can anyone suggest a kludge to let me do this? BTW, sometimes I have more
  1088. > than one per dialog.
  1089.  
  1090. My understanding is that although the system calls which access the
  1091. editText items take Pascal strings and thus are limited to 255 characters,
  1092. it's possible to have larger pieces of text in an editText item. You just
  1093. can't get that text out using the standard routines. You might want to
  1094. reverse-engineer just exactly what kind of handle is returned to you by
  1095. GetDItem. It may be a text handle and it may be a TE handle. Let us know
  1096. what you discover.
  1097.  
  1098. -- 
  1099.  
  1100.  Pete Gontier // CTO, Integer Poet Software // gurgle@dnai.com
  1101.  
  1102.  "Anything the Windows gang hates this much can't be all bad."
  1103.    -- Andrew Gore <agore@eworld.com>, on OpenDoc, MacWEEK 9/19/94
  1104.  
  1105. +++++++++++++++++++++++++++
  1106.  
  1107. >From gurgle@dnai.com (Pete Gontier)
  1108. Date: Mon, 26 Sep 1994 09:02:59 -0800
  1109. Organization: Integer Poet Software
  1110.  
  1111. In article <364jlo$rg6@uropax.contrib.de>, stk@uropax.contrib.de (Stefan
  1112. Kurth) wrote:
  1113.  
  1114. > In article <gurgle-2409941019350001@dynamic-229.dnai.com>,
  1115. > gurgle@dnai.com (Pete Gontier) wrote:
  1116. > > You might want to reverse-engineer just exactly what kind of handle is
  1117. > > returned to you by GetDItem. It may be a text handle and it may be a TE
  1118. > > handle. Let us know what you discover.
  1119. > Think Reference says it's the hText field of a TE handle, and that
  1120. > sounds reasonable to me, because there is only one TE handle in a
  1121. > dialog, even if there are several text fields.
  1122.  
  1123. However, if you call 'GetDItem' for an editText which is not active (does
  1124. not have the insertion point), the handle cannot be directly from the
  1125. 'hText' field. Perhaps it's
  1126. the-handle-which-might-be-in-the-'htext'-field. :-)
  1127.  
  1128. Anyway, it would be interesting if this sort of thing is an
  1129. Apple-documented behavior. I can't remember ever seeing documentation to
  1130. this effect; your THINK Reference, er, reference is news to me.
  1131.  
  1132. I'm not saying it's a bad idea to rely on this, but it would be nice to
  1133. see an Apple sanction, just to make it official.
  1134.  
  1135. -- 
  1136.  
  1137.  Pete Gontier // CTO, Integer Poet Software // gurgle@dnai.com
  1138.  
  1139.  "One of (Misty's) recent paintings, 'Interring the Terrier', 1993, which
  1140.  appears to show a small headless dog being stuffed inside a red armchair by
  1141.  two frogs and a sardine, sold at auction for $21,000 -- a record price..."
  1142.                            -- Busch and Silver, 'Why Cats Paint', p55
  1143.  
  1144. ---------------------------
  1145.  
  1146. >From craig@raru.adelaide.edu.au (Craig Kloeden)
  1147. Subject: Fast zeroing on PPC
  1148. Date: Sun, 18 Sep 1994 00:56:26 +0930
  1149. Organization: University of Adelaide
  1150.  
  1151. I have the following piece of code:
  1152.  
  1153. - -
  1154.  
  1155. Byte  plane[maxX][maxY];
  1156.  
  1157. for (i=0;i<maxX;i++)
  1158.   for (j=0;j<maxY;j++)
  1159.     plane[i][j] = 0;
  1160.  
  1161. - -
  1162.  
  1163. Believe it or not, this is a bottleneck in my program.
  1164. I need to make this as fast as possible on the PPC.
  1165.  
  1166. Any advice would be appreciated.
  1167.  
  1168. Craig
  1169.  
  1170. -- 
  1171. Craig Kloeden                 E-mail: craig@raru.adelaide.edu.au
  1172. Road Accident Research Unit   Phone : +61 8 303 5885
  1173. The University of Adelaide    Fax   : +61 8 232 4995
  1174. Australia                     Disclaimer: Not this little black duck!
  1175.  
  1176. +++++++++++++++++++++++++++
  1177.  
  1178. >From 103t_english@west.cscwc.pima.edu
  1179. Date: 17 Sep 94 11:06:28 MST
  1180. Organization: (none)
  1181.  
  1182. In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>,
  1183. craig@raru.adelaide.edu.au (Craig Kloeden) writes:
  1184. > I have the following piece of code:
  1185. > ---
  1186. > Byte  plane[maxX][maxY];
  1187. > for (i=0;i<maxX;i++)
  1188. >   for (j=0;j<maxY;j++)
  1189. >     plane[i][j] = 0;
  1190. > ---
  1191. > Believe it or not, this is a bottleneck in my program.
  1192. > I need to make this as fast as possible on the PPC.
  1193. > Any advice would be appreciated.
  1194.  
  1195. Please note that I've cross-posted this to c.s.powerpc, (which is where it
  1196. belongs, IMHO).
  1197.  
  1198. Several things that you can do here:
  1199.  
  1200. First, understand that you are dealing with a cached memory, where x values
  1201. can
  1202. fit in cache lines, and you want to deal with things one cache line at a
  1203. time.
  1204. Make the x loop your inner loop.
  1205.  
  1206. Second, recognize that you are dealing with 1 byte numbers when you could
  1207. easily
  1208. be dealing with 4-byte numbers (or 8 if you are doing this directly to video
  1209. where the video bus latency makes up for the slow speed of doing floating
  1210. point
  1211. load stores). Redo your loop as manipulating longs, and it will go much
  1212. faster.
  1213.  
  1214. Third, remember that the MPC601 chip "pipelines" loads and stores, so if you
  1215. "unroll/unwrap" your inner loop so that you are performing [at least] 4
  1216. loads/stores each time through, you will see a tremendous speedup.
  1217.  
  1218. Finally, if you have access to the PPCAsm, you can directly zero out this
  1219. memory (if it all fits in the L1 cache) by simply using the assembly language
  1220. instruction that zeros the cache rather than loading it from memory and THEN
  1221. zeroing it. This would give you a HUGE speedup from what I understand. I
  1222. don't
  1223. have my MPC601 user's manual handy, and this isn't something that I really
  1224. know
  1225. how to do, so if some kind soul that DOES know how to do this would go into
  1226. greater detail for him (and me)?
  1227.  
  1228. If you don't have the PPCAsm, maybe we could compose this routine on-line for
  1229. you, and I or somebody else could assemble it and either post it here in .hqx
  1230. format or just e-mail it to you... That way, you could just link it to your
  1231. program as a library routine...
  1232.  
  1233.  
  1234. Lawson
  1235.  
  1236. +++++++++++++++++++++++++++
  1237.  
  1238. >From jrb@mitre.org (Bob Boonstra)
  1239. Date: Sat, 17 Sep 1994 18:22:30 -0400
  1240. Organization: MITRE Corp.
  1241.  
  1242. In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>,
  1243. craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  1244.  
  1245. > I have the following piece of code:
  1246. > Byte  plane[maxX][maxY];
  1247. > for (i=0;i<maxX;i++)
  1248. >   for (j=0;j<maxY;j++)
  1249. >     plane[i][j] = 0;
  1250. > Believe it or not, this is a bottleneck in my program.
  1251. > I need to make this as fast as possible on the PPC.
  1252. > Any advice would be appreciated.
  1253.  
  1254. Others can probably do better, but you can get a significant improvement
  1255. by writing in units larger than bytes and by loop unrolling. For example, 
  1256. the following code is more than 4 times faster than the original:
  1257.  
  1258. register long double *p,*q; 
  1259. register long double zero=0;
  1260.  
  1261. p = (long double *)plane; 
  1262. q = p + maxX*maxY/sizeof(long double); 
  1263. /* This assumes maxY is a multiple of long double in size */ 
  1264. /* If not, add a cleanup loop at the end. */
  1265.  
  1266. while (p<q) { 
  1267.   *p = zero; *(p+1)=zero; *(p+2)=zero; *(p+3)=zero; 
  1268.   p += 4; 
  1269. }
  1270.  
  1271. This generates the following rather efficient PPC code using
  1272. Metrowerks CW4 (with maxX=64 and maxY=256):
  1273.  
  1274. 00000000: 80620000  lwz      r3,@41(RTOC)
  1275. 00000004: 80820000  lwz      r4,plane(RTOC)
  1276. 00000008: C8030000  lfd      fp0,0(r3)
  1277. 0000000C: 38044000  addi     r0,r4,16384
  1278. 00000010: 42800018  bc       ALWAYS,cr0_LT,*+24      ; $00000028
  1279. 00000014: D8040000  stfd     fp0,0(r4)
  1280. 00000018: D8040008  stfd     fp0,8(r4)
  1281. 0000001C: D8040010  stfd     fp0,16(r4)
  1282. 00000020: D8040018  stfd     fp0,24(r4)
  1283. 00000024: 38840020  addi     r4,r4,32
  1284. 00000028: 7C040040  cmplw    r4,r0
  1285. 0000002C: 4180FFE8  blt      *-24                    ; $00000014
  1286. 00000030: 4E800020  blr
  1287.  
  1288. For further info on PPC optimization, I suggest you look at the article
  1289. by Dave Evans in develop 18, the article by Dave Radcliffe in develop
  1290. 16, and a collection of articles in recent issues of MacTech by Richard
  1291. Clark.
  1292. -- 
  1293. -- Bob Boonstra
  1294. -- jrb@mitre.org
  1295. -- My opinion, not my employer's
  1296.  
  1297. +++++++++++++++++++++++++++
  1298.  
  1299. >From pchang@Xenon.Stanford.EDU (The Weasel)
  1300. Date: 18 Sep 1994 18:54:03 GMT
  1301. Organization: Computer Science Department, Stanford University.
  1302.  
  1303. >In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>,
  1304. >craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  1305. >
  1306. >> I have the following piece of code:
  1307. >> Byte  plane[maxX][maxY];
  1308. >> for (i=0;i<maxX;i++)
  1309. >>   for (j=0;j<maxY;j++)
  1310. >>     plane[i][j] = 0;
  1311. >> 
  1312. >> Believe it or not, this is a bottleneck in my program.
  1313. >> I need to make this as fast as possible on the PPC.
  1314. >> Any advice would be appreciated.
  1315.  
  1316. [ Good suggestions deleted ]
  1317.  
  1318. Another things you might try is to allocate your memory in a single
  1319. continous block and running through it linearly. The array references
  1320. that you have above is sort of equivilant to:
  1321.  
  1322.     plane[i * kMaxY + j] = ...
  1323.  
  1324. Additionally, this may not be true based on your snippet, but if you
  1325. are allocating the memory dynamically then allocating a single block
  1326. is definitely cheaper and easier on the cache.
  1327.  
  1328. Peter
  1329.  
  1330.  
  1331. +++++++++++++++++++++++++++
  1332.  
  1333. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1334. Date: Sun, 18 Sep 1994 14:38:12 +1200 (NZST)
  1335. Organization: (none)
  1336.  
  1337. craig@raru.adelaide.edu.au (Craig Kloeden) writes:
  1338. > I have the following piece of code:
  1339. > ---
  1340. > Byte  plane[maxX][maxY];
  1341. > for (i=0;i<maxX;i++)
  1342. >   for (j=0;j<maxY;j++)
  1343. >     plane[i][j] = 0;
  1344. > ---
  1345. > Believe it or not, this is a bottleneck in my program.
  1346. > I need to make this as fast as possible on the PPC.
  1347. > Any advice would be appreciated.
  1348.  
  1349. The quality of code generation doesn't matter much here -- it's all
  1350. in how efficiently you bash the memory subsystem.
  1351.  
  1352. The problem with the straight C code is that the processor has to read
  1353. the old data from RAM, then you zero it, then you write it back.  It's
  1354. twice as fast if you only have to write the data out.
  1355.  
  1356. This is exactly what the PPC "dcbz" instruction (Data Cache Block Zero)
  1357. does -- it zeros 32 bytes of memory without first reading it from external
  1358. RAM.  i.e. it totally ignores the previous contents.
  1359.  
  1360. This is useful no matter what you want to write into the memory, but it
  1361. you happen to *want* zeros, then you don't need to do anything else.
  1362.  
  1363. Here's a little PPC assembly routine that makes this instruction
  1364. available to you in C, and an XCOFF object file that you can use from
  1365. botht eh MPW and CodeWarrior compilers:
  1366.  
  1367. - -------------------------------
  1368. ; void Zero32Bytes(void *p)
  1369. ; function that zeros a 32 byte range of memory using dcbz
  1370.  
  1371.    export Zero32Bytes[DS]
  1372.    export .Zero32Bytes[PR]
  1373.  
  1374.    toc
  1375.    tc Zero32Bytes[TC], Zero32Bytes[DS]
  1376.  
  1377.    csect Zero32Bytes[DS]
  1378.    dc.l .Zero32Bytes[PR]
  1379.    dc.l TOC[tc0]
  1380.    dc.l 0
  1381.  
  1382.    csect .Zero32Bytes[PR]
  1383.    dcbz r0,r3 ;implicit r0=0
  1384.    blr
  1385. - -------------------------------
  1386. - -------------------------------
  1387.  
  1388.  
  1389. Be careful!  This is somewhat of a shotgun!  It zeros not the 32
  1390. bytes starting at the pointer, but the 32 bytes *around* the
  1391. pointer -- from p&~31 to p|31.  Make sure you don't want anything
  1392. that's already there next to your array!
  1393.  
  1394. *IF* your array is aligned to a 32-byte boundary AND each row is
  1395. a multiple of 32 bytes long, then all you need to use this is
  1396. (in C -- in C++ you'll need 'extern "C"'):
  1397.  
  1398. - -------------------------------
  1399. extern void Zero32Bytes(void *p);
  1400.  
  1401. Byte  plane[maxX][maxY];
  1402.  
  1403. for (i=0;i<maxX;i++)
  1404.   for (j=0;j<maxY;j+=32)
  1405.     Zero32Bytes(&plane[i][j]);
  1406. - -------------------------------
  1407.  
  1408. Hope this helps.
  1409.  
  1410. Oh, yeah, if you try to use this on non-cachable memory (such as the
  1411. video memory) you'll get an alignment exception trap.
  1412.  
  1413. -- Bruce
  1414.  
  1415. +++++++++++++++++++++++++++
  1416.  
  1417. >From al@crucible.powertools.com (Al Evans)
  1418. Date: 19 Sep 94 13:43:14 GMT
  1419. Organization: PowerTools, Austin, Texas
  1420.  
  1421. In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>
  1422. craig@raru.adelaide.edu.au (Craig Kloeden) writes:
  1423.  
  1424. >I have the following piece of code:
  1425.  
  1426. >---
  1427. >
  1428. >Byte  plane[maxX][maxY];
  1429. >
  1430. >for (i=0;i<maxX;i++)
  1431. >  for (j=0;j<maxY;j++)
  1432. >    plane[i][j] = 0;
  1433. >
  1434. >---
  1435.  
  1436. >Believe it or not, this is a bottleneck in my program.
  1437. >I need to make this as fast as possible on the PPC.
  1438.  
  1439. Here's an answer I haven't seen yet.
  1440.  
  1441. If you've got the memory to spare, you can initialize one copy of
  1442. your plane array, then use
  1443.  
  1444.     BlockMoveData(inittedMaster, plane, maxX * maxY);
  1445.  
  1446. To rapidly initialize the "real" plane. If plane is particularly large,
  1447. it will be hard to beat this technique for speed. And since BlockMove()
  1448. is a ROM routine, you can be certain it's optimized for each Mac model.
  1449.  
  1450.                     --Al Evans--
  1451. -- 
  1452. Al Evans        |   Graphic Elements: A new standard for 
  1453. ________________________|__ high-performance interactive Macintosh graphics.
  1454. al@crucible.powertools.com |  Available from mac.archive.umich.edu
  1455. - -------------------------|
  1456. /mac/development/libraries/graphicelements2.sit.hqx
  1457.  
  1458. +++++++++++++++++++++++++++
  1459.  
  1460. >From Darrin Cardani <Darrin.Cardani@AtlantaGA.NCR.COM>
  1461. Date: Mon, 19 Sep 1994 14:42:50 GMT
  1462. Organization: AT&T Global Information Solutions, Atlanta
  1463.  
  1464. >In article <35i2cb$2ug@Times.Stanford.EDU> The Weasel writes: 
  1465. >>In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>,
  1466. >>craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  1467. >>
  1468. >>> I have the following piece of code:
  1469. >>> Byte  plane[maxX][maxY];
  1470. >>> for (i=0;i<maxX;i++)
  1471. >>>   for (j=0;j<maxY;j++)
  1472. >>>     plane[i][j] = 0;
  1473. >>> 
  1474. >>> Believe it or not, this is a bottleneck in my program.
  1475. >>> I need to make this as fast as possible on the PPC.
  1476. >>> Any advice would be appreciated.
  1477. >
  1478. >[ Good suggestions deleted ]
  1479. >
  1480. >Another things you might try is to allocate your memory in a single
  1481. >continous block and running through it linearly. The array references
  1482. >that you have above is sort of equivilant to:
  1483. >
  1484. >    plane[i * kMaxY + j] = ...
  1485.  
  1486. What about
  1487.  
  1488. Ptr plane;
  1489.  
  1490. plane = NewPtrClear (maxX*maxY);
  1491.  
  1492. Or is NewPtrClear not very efficient?
  1493.  
  1494. Darrin
  1495.  
  1496.  
  1497.  
  1498.  
  1499.  
  1500.  
  1501.  
  1502. +++++++++++++++++++++++++++
  1503.  
  1504. >From weare@galaxy.ucr.edu (christopher weare)
  1505. Date: 19 Sep 1994 10:47:33 -0700
  1506. Organization: University of California, Riverside
  1507.  
  1508. <fast zeroing stuff deleted>
  1509.  
  1510. You might want to try unrolling your loops abit:
  1511.  
  1512. long    numFloats, i;
  1513. float    *pointer,*temp;
  1514.     
  1515.     pointer = (float *)NewPointer(sizeof(float)*numFloats);
  1516.     temp = pointer;
  1517.  
  1518.     for(i=0;i<numFloats;i+=4){
  1519.         *(temp) = 0.0;
  1520.         *(temp+1) = 0.0;
  1521.         *(temp+2) = 0.0;
  1522.         *(temp+3) = 0.0;
  1523.  
  1524.         temp += 4;
  1525.     }
  1526.  
  1527. ...
  1528.  
  1529. ofcourse this assumes that numFloats is divisable by for.  If not just clean
  1530. up at the end of the main loop.  Notice that this requires only addition in
  1531. calculating offsets and should keep the pipelines busy.  Experiment with the 
  1532. amount of unrolling.  As always, your milage may vary.
  1533.  
  1534. Chris
  1535. weare@galaxy.ucr.edu 
  1536.  
  1537.  
  1538.  
  1539. +++++++++++++++++++++++++++
  1540.  
  1541. >From dsemchi@glenayre.com (Dale Semchishen [4597])
  1542. Date: Mon, 19 Sep 1994 19:24:55 GMT
  1543. Organization: Glenayre Electronics Ltd.
  1544.  
  1545. In article 2ug@Times.Stanford.EDU, pchang@Xenon.Stanford.EDU (The Weasel)
  1546. writes:
  1547. >>In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>,
  1548. >>craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  1549. >>
  1550. >>> I have the following piece of code:
  1551. >>> Byte  plane[maxX][maxY];
  1552. >>> for (i=0;i<maxX;i++)
  1553. >>>   for (j=0;j<maxY;j++)
  1554. >>>     plane[i][j] = 0;
  1555. >>> 
  1556. >>> Believe it or not, this is a bottleneck in my program.
  1557. >>> I need to make this as fast as possible on the PPC.
  1558. >>> Any advice would be appreciated.
  1559.  
  1560. You write a function that zeros a generic buffer as follows:
  1561.  
  1562.     - two parameters (buffer_pointer and number_of_bytes)
  1563.     - calculate how many longs are in buffer by shifting number_of_bytes
  1564.       right twice
  1565.     - clear the calculated number of longs and then the remaining bytes
  1566.  
  1567. If you are compiling your source code for PPC and the Plain Jane 68000,
  1568. then your function must make sure it does not write a long to an odd address.
  1569.  
  1570. - -
  1571. Dale Semchishen           | dsemchi@glenayre.com
  1572. Glenayre Electronics Ltd  | (604) 293-1611
  1573. Vancouver, BC, CANADA     |
  1574.  
  1575.  
  1576.  
  1577. +++++++++++++++++++++++++++
  1578.  
  1579. >From zstern@adobe.com (Zalman Stern)
  1580. Date: Tue, 20 Sep 1994 02:30:52 GMT
  1581. Organization: Adobe Systems Incorporated
  1582.  
  1583. Al Evans writes
  1584. > If you've got the memory to spare, you can initialize one copy of
  1585. > your plane array, then use
  1586. >     BlockMoveData(inittedMaster, plane, maxX * maxY);
  1587. > To rapidly initialize the "real" plane. If plane is particularly large,
  1588. > it will be hard to beat this technique for speed. And since BlockMove()
  1589. > is a ROM routine, you can be certain it's optimized for each Mac model.
  1590.  
  1591. This is a bad answer as it takes approximately twice the memory bandwidth.  
  1592. (And introduces another read latency into a conceptually write only  
  1593. operation.) To put it mildly, there is a reason you haven't this mentioned  
  1594. yet.
  1595.  
  1596. In theory, the right solution is "memset(plane, 0, sizeof(plane));" but  
  1597. Apple blew it big time in implementing memset. A really good PowerPC  
  1598. implementation of this operation might try to use the data cache block zero  
  1599. instruction, though  it cannot be used on uncached memory and you p[retty  
  1600. much have to know the cache block size to implement the code. (In other  
  1601. words, doing it portably requires dynamic code generation.)
  1602.  
  1603. For this application, an unrolled loop that writes longs will probably work  
  1604. fine. Writing floating-point values on the MPC601 is dubious as you can only  
  1605. get in one floating-point store per 3 cycles. If you're going to uncached  
  1606. memory that is probably the right thing. Otherwise not.
  1607. --
  1608. Zalman Stern           zalman@adobe.com            (415) 962 3824
  1609. Adobe Systems, 1585 Charleston Rd., POB 7900, Mountain View, CA 94039-7900
  1610.  Please do not change color while I am talking to you -- MC 900 Ft Jesus.
  1611.  
  1612. +++++++++++++++++++++++++++
  1613.  
  1614. >From ari@world.std.com (Ari I Halberstadt)
  1615. Date: Tue, 20 Sep 1994 02:30:40 GMT
  1616. Organization: The World Public Access UNIX, Brookline, MA
  1617.  
  1618. In article <2862743892@hoult.actrix.gen.nz>,
  1619. Bruce Hoult <Bruce@hoult.actrix.gen.nz> wrote:
  1620. >craig@raru.adelaide.edu.au (Craig Kloeden) writes:
  1621. >> I have the following piece of code:
  1622. >> 
  1623. >> ---
  1624. >> 
  1625. >> Byte  plane[maxX][maxY];
  1626. >> 
  1627. >> for (i=0;i<maxX;i++)
  1628. >>   for (j=0;j<maxY;j++)
  1629. >>     plane[i][j] = 0;
  1630. >> 
  1631. >> ---
  1632. >> 
  1633. >> Believe it or not, this is a bottleneck in my program.
  1634. >> I need to make this as fast as possible on the PPC.
  1635. >> 
  1636. >> Any advice would be appreciated.
  1637. >
  1638. >The quality of code generation doesn't matter much here -- it's all
  1639. >in how efficiently you bash the memory subsystem.
  1640.  
  1641. Actually, the quality of code generation is quite important. Compilers
  1642. can do all sorts of tricks to speed up loops like the above. Things
  1643. that are often done manually, such as loop unrolling, pointer
  1644. arithmetic, common subexpression elimination, etc. can all be handled
  1645. by the compiler. And the compiler may be better suited to make decisions
  1646. on pipelining instructions for a RISC processor.
  1647.  
  1648. What the original poster needs is to zero a block of memory of maxY by
  1649. maxX bytes. The simple call memset(p,0,n) is almost always sufficient
  1650. and it's portable. Assuming the compiler's optimizer or implementation
  1651. of memset is pathetic, he can hand-code all sorts of optimizations,
  1652. most of which have already been suggested.  One other way to unroll a
  1653. loop is to use a fancy (or obscure, take your pick) switch statement;
  1654. most C texts have it as an exercise in "what does this do", but I
  1655. don't know if it really is any faster than a more obvious loop
  1656. unrolling. The use of a dedicated processor instruction (as suggested
  1657. by Bruce) along with the other optimizations should result in a
  1658. memory-zeroing routine that is as fast as can be made.
  1659.  
  1660. Further optimizations would have to examine the need for the zeroed
  1661. memory.
  1662.  
  1663. Does the memory have to be zeroed, or is it just being filled up with
  1664. data later on that don't need to be zeroed initially?
  1665.  
  1666. Is the array being used to represent a data structure that would be
  1667. better represented in some other form?
  1668.  
  1669. Is the algorithm written in such a way that the memory zeroing code is
  1670. being called more than may be necessary?
  1671.  
  1672. Could the memory be zeroed in small chunks over time, rather than all
  1673. at once? You could spawn a thread to do the zeroing, and run it in the
  1674. background while the user is figuring out which buttons to click. By
  1675. the time the user is ready to do something, the memory is zeroed, and
  1676. the user will notice no delay. If the user is real speedy, you can
  1677. always wait for the thread to complete before proceeding. (This is an
  1678. approximation of parallelization, where a second processor and
  1679. instruction set are simulated via a thread.)
  1680.  
  1681.  
  1682.  
  1683.  
  1684. -- 
  1685. Ari Halberstadt                                 ari@world.std.com
  1686. One generation passes away, and another generation comes: but the
  1687. earth abides for ever. -- Ecclesiastes, 1:4.
  1688.  
  1689. +++++++++++++++++++++++++++
  1690.  
  1691. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  1692. Date: Tue, 20 Sep 1994 16:10:12 +1200 (NZST)
  1693. Organization: (none)
  1694.  
  1695. 103t_english@west.cscwc.pima.edu writes:
  1696. > > Byte  plane[maxX][maxY];
  1697. > > 
  1698. > > for (i=0;i<maxX;i++)
  1699. > >   for (j=0;j<maxY;j++)
  1700. > >     plane[i][j] = 0;
  1701. > Finally, if you have access to the PPCAsm, you can directly zero out this
  1702. > memory (if it all fits in the L1 cache) by simply using the assembly
  1703. language
  1704. > instruction that zeros the cache rather than loading it from memory and
  1705. THEN
  1706. > zeroing it. This would give you a HUGE speedup from what I understand. I
  1707. don't
  1708. > have my MPC601 user's manual handy, and this isn't something that I really
  1709. know
  1710. > how to do, so if some kind soul that DOES know how to do this would go into
  1711. > greater detail for him (and me)?
  1712. > If you don't have the PPCAsm, maybe we could compose this routine on-line
  1713. for
  1714. > you, and I or somebody else could assemble it and either post it here in
  1715. .hqx
  1716. > format or just e-mail it to you... That way, you could just link it to your
  1717. > program as a library routine...
  1718.  
  1719. Already done :-)
  1720.  
  1721. +++++++++++++++++++++++++++
  1722.  
  1723. >From craig@raru.adelaide.edu.au (Craig Kloeden)
  1724. Date: Tue, 20 Sep 1994 22:55:44 +0930
  1725. Organization: University of Adelaide
  1726.  
  1727. In article <2862743892@hoult.actrix.gen.nz>, Bruce@hoult.actrix.gen.nz
  1728. (Bruce Hoult) wrote:
  1729. - > Byte  plane[maxX][maxY];
  1730. - > 
  1731. - > for (i=0;i<maxX;i++)
  1732. - >   for (j=0;j<maxY;j++)
  1733. - >     plane[i][j] = 0;
  1734. - > Believe it or not, this is a bottleneck in my program.
  1735. - > I need to make this as fast as possible on the PPC.
  1736. - > 
  1737. - > Any advice would be appreciated.
  1738. - The quality of code generation doesn't matter much here -- it's all
  1739. - in how efficiently you bash the memory subsystem.
  1740. - The problem with the straight C code is that the processor has to read
  1741. - the old data from RAM, then you zero it, then you write it back.  It's
  1742. - This is exactly what the PPC "dcbz" instruction (Data Cache Block Zero)
  1743. - does -- it zeros 32 bytes of memory without first reading it from external
  1744. - RAM.  i.e. it totally ignores the previous contents.
  1745. - This is useful no matter what you want to write into the memory, but it
  1746. - you happen to *want* zeros, then you don't need to do anything else.
  1747. - Here's a little PPC assembly routine that makes this instruction
  1748. - available to you in C, and an XCOFF object file that you can use from
  1749. - botht eh MPW and CodeWarrior compilers:
  1750.  
  1751. Many many thanks. This is exactly what i needed.
  1752. Check out ftp://raru.adelaide.edu.au/rotater/
  1753. if you want to see the final program.
  1754.  
  1755. thanks again
  1756.  
  1757. Craig
  1758.  
  1759. -- 
  1760. Craig Kloeden                 E-mail: craig@raru.adelaide.edu.au
  1761. Road Accident Research Unit   Phone : +61 8 303 5885
  1762. The University of Adelaide    Fax   : +61 8 232 4995
  1763. Australia                     Disclaimer: Not this little black duck!
  1764.  
  1765. +++++++++++++++++++++++++++
  1766.  
  1767. >From mcgrath@egret.SLAC.Stanford.EDU (Gary G. McGrath)
  1768. Date: Tue, 20 Sep 1994 20:25:54 GMT
  1769. Organization: University of California, Department of Physics
  1770.  
  1771.  
  1772. |> If you've got the memory to spare, you can initialize one copy of
  1773. |> your plane array, then use
  1774. |> 
  1775. |>     BlockMoveData(inittedMaster, plane, maxX * maxY);
  1776. |> 
  1777. |> To rapidly initialize the "real" plane. If plane is particularly large,
  1778. |> it will be hard to beat this technique for speed. And since BlockMove()
  1779. |> is a ROM routine, you can be certain it's optimized for each Mac model.
  1780.  
  1781. -- 
  1782.  
  1783. Maybe some apple folks can better tell us the validity of this last sentence. 
  1784. Can
  1785. we be sure that BlockMoveData will be optimized for whatever platform it is
  1786. on?  I
  1787. seem to remember a MacTech article on 040 assembly optimization of
  1788. BlockMoveData
  1789. where he got something like a factor 2+ on small to medium size routines
  1790. because of
  1791. less overhead.  I would say that is consistent with my experience.
  1792.  
  1793.                     Sincerely,
  1794.                     Gary McGrath
  1795.  
  1796. +---------------------+--------------------------------------------
  1797. | _ O _    O      O   | Gary McGrath                               \
  1798. |  \|/   _/|\_   |||  | Stanford Linear Accelerator Center, MS-95   \
  1799. |   |      |      |   | PO Box 4349                                  \
  1800. | _/ \_  _/ \_  _/ \_ | Stanford, CA 94307 |  27887::gary             \ 
  1801. |---------------------|                    |  gmcgrath@uci.edu         \
  1802. | Shiny, Happy People | (415) 926-3593     |  mcgrath@slac.stanford.edu \
  1803. +---------------------+--------------------+------------------------------
  1804.  
  1805. * My opinions do not represent those of Stanford University,
  1806. the University of California, or the D.O.E.
  1807.  
  1808. +++++++++++++++++++++++++++
  1809.  
  1810. >From 103t_english@west.cscwc.pima.edu
  1811. Date: 21 Sep 94 08:39:09 MST
  1812. Organization: (none)
  1813.  
  1814. In article <2862743892@hoult.actrix.gen.nz>, Bruce@hoult.actrix.gen.nz (Bruce
  1815. Hoult) writes:
  1816. > craig@raru.adelaide.edu.au (Craig Kloeden) writes:
  1817. >> I have the following piece of code:
  1818. >> 
  1819. >> ---
  1820. >> 
  1821. >> Byte  plane[maxX][maxY];
  1822. >> 
  1823. >> for (i=0;i<maxX;i++)
  1824. >>   for (j=0;j<maxY;j++)
  1825. >>     plane[i][j] = 0;
  1826. >> 
  1827. >> ---
  1828. >> 
  1829. >> Believe it or not, this is a bottleneck in my program.
  1830. >> I need to make this as fast as possible on the PPC.
  1831. >> 
  1832. >> Any advice would be appreciated.
  1833. > The quality of code generation doesn't matter much here -- it's all
  1834. > in how efficiently you bash the memory subsystem.
  1835. > The problem with the straight C code is that the processor has to read
  1836. > the old data from RAM, then you zero it, then you write it back.  It's
  1837. > twice as fast if you only have to write the data out.
  1838. > This is exactly what the PPC "dcbz" instruction (Data Cache Block Zero)
  1839. > does -- it zeros 32 bytes of memory without first reading it from external
  1840. > RAM.  i.e. it totally ignores the previous contents.
  1841. > This is useful no matter what you want to write into the memory, but it
  1842. > you happen to *want* zeros, then you don't need to do anything else.
  1843. > Here's a little PPC assembly routine that makes this instruction
  1844. > available to you in C, and an XCOFF object file that you can use from
  1845. > botht eh MPW and CodeWarrior compilers:
  1846. > ---------------------------------
  1847. > ; void Zero32Bytes(void *p)
  1848. > ; function that zeros a 32 byte range of memory using dcbz
  1849. >    export Zero32Bytes[DS]
  1850. >    export .Zero32Bytes[PR]
  1851. >    toc
  1852. >    tc Zero32Bytes[TC], Zero32Bytes[DS]
  1853. >    csect Zero32Bytes[DS]
  1854. >    dc.l .Zero32Bytes[PR]
  1855. >    dc.l TOC[tc0]
  1856. >    dc.l 0
  1857. >    csect .Zero32Bytes[PR]
  1858. >    dcbz r0,r3 ;implicit r0=0
  1859. >    blr
  1860. > ---------------------------------
  1861. > (This file must be converted with BinHex 4.0)
  1862. > :$eTPFQmc-N*jG'9c,R-ZE`"B3dp'69"6)!%!!!!"L3!!!!#qA!(I!!+USJ#p!!!
  1863. > !QJ!!!!X!!!!!,R4PH(3!!!!!!!!!!!!!!!!!!!J!!!"N!!!!!!!!!!!!!!!!!!!
  1864. > !)#jNBA4K!!!!!!!!#!!!!!J!!!!3!!!!E!!!!(`!!!!!!!-!!!!!!%"m!"rX6S!
  1865. > !)!!!!!!!!!!8!!!!!!!!!!J!!!!)!!!!#4m!!!!!$!!!!!-I!!!!!"3!!!!((`"
  1866. > NBf*k,R-!!!!!!!$rrJ`"C`!!!!!!!!!!!!!!!!!!!3!!D`%!!!!!!!!!!!!!%3!
  1867. > !!!!!!!"86d-!!!!!!!!!!"3!!J!!D`%!!!!!!!!!!!!!%3m!!!!!!!!!!!!!!!!
  1868. > !"!!!!"3!!J!!D`%!!!!%!!!!!!!!%3-!!!!!!!!!!!!!!!!!%!!!!!J!!J!!!J%
  1869. > !!!!-!!!!!!!!%3S!!!!!!!!!!!!!!!!!(!!!!!!!!3!!!J%!!!!)!!!!!!!!%3!
  1870. > !!!!!!!!!!!!T@Q9bEc-b3RPdCA-!@Q9bEc-b3RPdCA-!,PTPFQmc-N*jG'9c!$e
  1871. > c!!!:
  1872. > ---------------------------------
  1873. > Be careful!  This is somewhat of a shotgun!  It zeros not the 32
  1874. > bytes starting at the pointer, but the 32 bytes *around* the
  1875. > pointer -- from p&~31 to p|31.  Make sure you don't want anything
  1876. > that's already there next to your array!
  1877. > *IF* your array is aligned to a 32-byte boundary AND each row is
  1878. > a multiple of 32 bytes long, then all you need to use this is
  1879. > (in C -- in C++ you'll need 'extern "C"'):
  1880. > ---------------------------------
  1881. > extern void Zero32Bytes(void *p);
  1882. > Byte  plane[maxX][maxY];
  1883. > for (i=0;i<maxX;i++)
  1884. >   for (j=0;j<maxY;j+=32)
  1885. >     Zero32Bytes(&plane[i][j]);
  1886. > ---------------------------------
  1887. > Hope this helps.
  1888. > Oh, yeah, if you try to use this on non-cachable memory (such as the
  1889. > video memory) you'll get an alignment exception trap.
  1890. > -- Bruce
  1891.  
  1892. I notice that you don't bother with the prologue/epilogue stuff. That's
  1893. because
  1894. it don't use no local memory, and doesn't call any subroutines, right?
  1895.  
  1896. I tried to get Tim Olson's more robust zerobyte procedure to work with
  1897. PPCAsm,
  1898. but I didn't understand his syntax. It looked like it was designed for an
  1899. assembler similar to, but not identical with, PPCAsm (the first time I tried
  1900. to
  1901. assemble it, it had hundreds of errors).
  1902.  
  1903. BTW, I think that we should start compiling a list of useful
  1904. assembly-language
  1905. routines to suppliment the less-than-perfect compilers that the PowerMac has
  1906. available. This could be tacked onto the end of Jon's Mac Programming FAQ, or
  1907. could (eventually) be kept separate.
  1908.  
  1909. The source code, the tool used to assemble it, and binhexed object code could
  1910. all be supplied.
  1911.  
  1912. Comments?
  1913.  
  1914.  
  1915.  
  1916. Lawson
  1917.  
  1918. +++++++++++++++++++++++++++
  1919.  
  1920. >From 103t_english@west.cscwc.pima.edu
  1921. Date: 21 Sep 94 08:40:32 MST
  1922. Organization: (none)
  1923.  
  1924. In article <CwDsvF.BIJ@attatl.AtlantaGA.NCR.COM>, Darrin Cardani
  1925. <Darrin.Cardani@AtlantaGA.NCR.COM> writes:
  1926. >>In article <35i2cb$2ug@Times.Stanford.EDU> The Weasel writes: 
  1927. >>>In article <craig-1809940056260001@ckloeden.dialup.adelaide.edu.au>,
  1928. >>>craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  1929. >>>
  1930. >>>> I have the following piece of code:
  1931. >>>> Byte  plane[maxX][maxY];
  1932. >>>> for (i=0;i<maxX;i++)
  1933. >>>>   for (j=0;j<maxY;j++)
  1934. >>>>     plane[i][j] = 0;
  1935. >>>> 
  1936. >>>> Believe it or not, this is a bottleneck in my program.
  1937. >>>> I need to make this as fast as possible on the PPC.
  1938. >>>> Any advice would be appreciated.
  1939. >>
  1940. >>[ Good suggestions deleted ]
  1941. >>
  1942. >>Another things you might try is to allocate your memory in a single
  1943. >>continous block and running through it linearly. The array references
  1944. >>that you have above is sort of equivilant to:
  1945. >>
  1946. >>    plane[i * kMaxY + j] = ...
  1947. > What about
  1948. > Ptr plane;
  1949. > plane = NewPtrClear (maxX*maxY);
  1950. > Or is NewPtrClear not very efficient?
  1951. > Darrin
  1952.  
  1953. Only works the first time...
  1954.  
  1955.  
  1956.  
  1957. Lawson
  1958.  
  1959. +++++++++++++++++++++++++++
  1960.  
  1961. >From ari@world.std.com (Ari I Halberstadt)
  1962. Date: Thu, 22 Sep 1994 02:43:54 GMT
  1963. Organization: The World Public Access UNIX, Brookline, MA
  1964.  
  1965. In article <1994Sep21.083909@west.cscwc.pima.edu>,
  1966.  <103t_english@west.cscwc.pima.edu> wrote:
  1967. >BTW, I think that we should start compiling a list of useful
  1968. assembly-language
  1969. >routines to suppliment the less-than-perfect compilers that the PowerMac has
  1970. >available. This could be tacked onto the end of Jon's Mac Programming FAQ,
  1971. or
  1972. >could (eventually) be kept separate.
  1973. >
  1974. >The source code, the tool used to assemble it, and binhexed object code
  1975. could
  1976. >all be supplied.
  1977.  
  1978. This is what the newsgroup alt.sources.mac is for. It's still
  1979. premature to consider splitting it into alt.sources.mac.ppc, since
  1980. most of the traffic seems to be from people unclear on the purpose of
  1981. alt.sources.mac. The archive sites should probably add a "dev/src/ppc"
  1982. directory; you might suggest this to the info-mac folks and other
  1983. major sites. The FAQ could contain a specific pointer to the various
  1984. places to find these PPC goodies.
  1985. -- 
  1986. Ari Halberstadt                                 ari@world.std.com
  1987. One generation passes away, and another generation comes: but the
  1988. earth abides for ever. -- Ecclesiastes, 1:4.
  1989.  
  1990. +++++++++++++++++++++++++++
  1991.  
  1992. >From craig@raru.adelaide.edu.au (Craig Kloeden)
  1993. Date: Fri, 23 Sep 1994 09:21:46 +0930
  1994. Organization: University of Adelaide
  1995.  
  1996. In article <CwEpn5.A00@world.std.com>, ari@world.std.com (Ari I
  1997. Halberstadt) wrote:
  1998. > >> Byte  plane[maxX][maxY];
  1999. > >> 
  2000. > >> for (i=0;i<maxX;i++)
  2001. > >>   for (j=0;j<maxY;j++)
  2002. > >>     plane[i][j] = 0;
  2003. > >The quality of code generation doesn't matter much here -- it's all
  2004. > >in how efficiently you bash the memory subsystem.
  2005. > Actually, the quality of code generation is quite important. Compilers
  2006. > can do all sorts of tricks to speed up loops like the above. Things
  2007. > that are often done manually, such as loop unrolling, pointer
  2008. > arithmetic, common subexpression elimination, etc. can all be handled
  2009. > by the compiler. And the compiler may be better suited to make decisions
  2010. > on pipelining instructions for a RISC processor.
  2011. > What the original poster needs is to zero a block of memory of maxY by
  2012. > maxX bytes. The simple call memset(p,0,n) is almost always sufficient
  2013. > and it's portable. Assuming the compiler's optimizer or implementation
  2014. > of memset is pathetic, he can hand-code all sorts of optimizations,
  2015. > most of which have already been suggested.  One other way to unroll a
  2016. > loop is to use a fancy (or obscure, take your pick) switch statement;
  2017. > most C texts have it as an exercise in "what does this do", but I
  2018. > don't know if it really is any faster than a more obvious loop
  2019. > unrolling. The use of a dedicated processor instruction (as suggested
  2020. > by Bruce) along with the other optimizations should result in a
  2021. > memory-zeroing routine that is as fast as can be made.
  2022. > Further optimizations would have to examine the need for the zeroed
  2023. > memory.
  2024. > Does the memory have to be zeroed, or is it just being filled up with
  2025. > data later on that don't need to be zeroed initially?
  2026.  
  2027. It has to be filled to zero.
  2028.  
  2029. > Is the array being used to represent a data structure that would be
  2030. > better represented in some other form?
  2031.  
  2032. Represents the screen. Well actually it is for keeping a record of the
  2033. 'depth' of the last plotted pixel to that location. (for hidden point
  2034. removal in displaying 3d images.
  2035.  
  2036. > Is the algorithm written in such a way that the memory zeroing code is
  2037. > being called more than may be necessary?
  2038.  
  2039. Only once per frame :-)
  2040.  
  2041. > Could the memory be zeroed in small chunks over time, rather than all
  2042. > at once? You could spawn a thread to do the zeroing, and run it in the
  2043. > background while the user is figuring out which buttons to click.
  2044.  
  2045. nope. i need it straight away
  2046.  
  2047. Here are some rough benchmarks that I ran. (using CW4)
  2048.  
  2049. Time      Method
  2050. - --      ------
  2051. 1033      Clearing Individual Bytes
  2052.  270      Clearing 1 long at a time
  2053.  249      memset()
  2054.  226      Clearing 2 longs at a time (unrolled loop)
  2055.  213      Clearing 3 longs at a time (unrolled loop)
  2056.  204      Clearing 4 longs at a time (unrolled loop)
  2057.   55      bzero*
  2058.  
  2059. * bzero is an XCOFF written by tim@apple.com (Tim Olson)
  2060.   posted recently to comp.sys.powerpc
  2061.   assumes cacheable memory (i.e. uses DCBZ)
  2062.   assumes 32-byte cache block/sector (works on 601, 603, 604)
  2063.  
  2064. The rest of my code uses 386 units of time (best case) so all
  2065. but the last significantly cuts into my frame rate.
  2066. Guess which one i am using :-)
  2067.  
  2068. regards and thanks
  2069.  
  2070. Craig
  2071.  
  2072. ps. the program i am working on with source is at:
  2073. ftp://raru.adelaide.edu.au/rotater/
  2074.  
  2075. -- 
  2076. Craig Kloeden                 E-mail: craig@raru.adelaide.edu.au
  2077. Road Accident Research Unit   Phone : +61 8 303 5885
  2078. The University of Adelaide    Fax   : +61 8 232 4995
  2079. Australia                     Disclaimer: Not this little black duck!
  2080.  
  2081. +++++++++++++++++++++++++++
  2082.  
  2083. >From al@crucible.powertools.com (Al Evans)
  2084. Date: 23 Sep 94 14:41:45 GMT
  2085. Organization: PowerTools, Austin, Texas
  2086.  
  2087. In article <1994Sep20.023052.26490@adobe.com> zstern@adobe.com (Zalman Stern)
  2088. writes:
  2089.  
  2090. >> use
  2091. >>     BlockMoveData(inittedMaster, plane, maxX * maxY);
  2092. >> To rapidly initialize the "real" plane. 
  2093.  
  2094. >This is a bad answer as it takes approximately twice the memory bandwidth.  
  2095. >(And introduces another read latency into a conceptually write only  
  2096. >operation.) To put it mildly, there is a reason you haven't this mentioned  
  2097. >yet.
  2098.  
  2099. Oops. Obviously, you're right. I can only plead brain-fade, and the
  2100. fact that I was thinking of a case where the memory in question had
  2101. to be initialized to something more complex than all zeros.
  2102.  
  2103.                     --Al Evans--
  2104. -- 
  2105. Al Evans        |   Graphic Elements: A new standard for 
  2106. ________________________|__ high-performance interactive Macintosh graphics.
  2107. al@crucible.powertools.com |  Available from mac.archive.umich.edu
  2108. - -------------------------|
  2109. /mac/development/libraries/graphicelements2.sit.hqx
  2110.  
  2111. +++++++++++++++++++++++++++
  2112.  
  2113. >From usenet@lowry.eche.ualberta.ca (Brian Lowry)
  2114. Date: Fri, 23 Sep 1994 10:38:08 -0800
  2115. Organization: Dept. of Chemical Eng., University of Alberta
  2116.  
  2117. In article <craig-2309940921460001@ckloeden.dialup.adelaide.edu.au>,
  2118. craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  2119.  
  2120. > Here are some rough benchmarks that I ran. (using CW4)
  2121.  
  2122. > Time      Method
  2123. > ----      ------
  2124. > 1033      Clearing Individual Bytes
  2125. >  270      Clearing 1 long at a time
  2126. >  249      memset()
  2127. >  226      Clearing 2 longs at a time (unrolled loop)
  2128. >  213      Clearing 3 longs at a time (unrolled loop)
  2129. >  204      Clearing 4 longs at a time (unrolled loop)
  2130. >   55      bzero*
  2131.  
  2132. > * bzero is an XCOFF written by tim@apple.com (Tim Olson)
  2133. >   posted recently to comp.sys.powerpc
  2134. >   assumes cacheable memory (i.e. uses DCBZ)
  2135. >   assumes 32-byte cache block/sector (works on 601, 603, 604)
  2136.  
  2137. Did you try something like:
  2138. //plane is a 2D array of bytes
  2139. //N = (xMax * yMax) / 8;
  2140.  
  2141. register double dblZero = +0.0;
  2142. register double *doubleP;
  2143.  
  2144. for (i=N, doubleP = &plane[maxX][maxY]; i>0; i--)
  2145. {  *(--doubleP) = dblZero;}
  2146.  
  2147. I believe a double precision zero is a 64bit zero, and that this takes
  2148. fewer clock cycles than writing longs (but I could be wrong).  Just
  2149. curious how it might compare...
  2150.  
  2151. -- 
  2152.  
  2153. Brian Lowry
  2154.  
  2155. +++++++++++++++++++++++++++
  2156.  
  2157. >From 103t_english@west.cscwc.pima.edu
  2158. Date: 23 Sep 94 18:42:15 MST
  2159. Organization: (none)
  2160.  
  2161. In article <usenet-2309941038080001@lowry.eche.ualberta.ca>,
  2162. usenet@lowry.eche.ualberta.ca (Brian Lowry) writes:
  2163. > In article <craig-2309940921460001@ckloeden.dialup.adelaide.edu.au>,
  2164. > craig@raru.adelaide.edu.au (Craig Kloeden) wrote:
  2165. >> Here are some rough benchmarks that I ran. (using CW4)
  2166. [deleted]
  2167. > Did you try something like:
  2168. > //plane is a 2D array of bytes
  2169. > //N = (xMax * yMax) / 8;
  2170. > register double dblZero = +0.0;
  2171. > register double *doubleP;
  2172. > for (i=N, doubleP = &plane[maxX][maxY]; i>0; i--)
  2173. > {  *(--doubleP) = dblZero;}
  2174. > I believe a double precision zero is a 64bit zero, and that this takes
  2175. > fewer clock cycles than writing longs (but I could be wrong).  Just
  2176. > curious how it might compare...
  2177. >        
  2178.  
  2179. Come on Brian, even *I* know that 8-byte floating-point writes take 3 cycles
  2180. while the 4-byte store takes 1 cycle (allowing for pipelining, etc -best
  2181. case).
  2182.  
  2183. The only time that the double store is better is on non-cached memory like
  2184. VRAM, where the bus interface is your biggest problem.
  2185.  
  2186. Your scheme is good for zeroing video.
  2187.  
  2188.  
  2189. (Gorsh! I almost sound like a know what I'm talking about... I hope I didn't
  2190. mangle what everyone else has told me too badly)
  2191.  
  2192.  
  2193. Lawson
  2194.  
  2195. +++++++++++++++++++++++++++
  2196.  
  2197. >From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
  2198. Date: Sun, 25 Sep 1994 12:57:26 +1200 (NZST)
  2199. Organization: (none)
  2200.  
  2201. ari@world.std.com (Ari I Halberstadt) writes:
  2202. > >> Byte  plane[maxX][maxY];
  2203. > >> 
  2204. > >> for (i=0;i<maxX;i++)
  2205. > >>   for (j=0;j<maxY;j++)
  2206. > >>     plane[i][j] = 0;
  2207. > >> 
  2208. > >> ---
  2209. > >> 
  2210. > >> Believe it or not, this is a bottleneck in my program.
  2211. > >> I need to make this as fast as possible on the PPC.
  2212. > >> 
  2213. > >> Any advice would be appreciated.
  2214. > >
  2215. > >The quality of code generation doesn't matter much here -- it's all
  2216. > >in how efficiently you bash the memory subsystem.
  2217. > Actually, the quality of code generation is quite important. Compilers
  2218. > can do all sorts of tricks to speed up loops like the above. Things
  2219. > that are often done manually, such as loop unrolling, pointer
  2220. > arithmetic, common subexpression elimination, etc. can all be handled
  2221. > by the compiler. And the compiler may be better suited to make decisions
  2222. > on pipelining instructions for a RISC processor.
  2223.  
  2224. I stand by my original statement -- the quality of code generation in this
  2225. loop matters not at all.
  2226.  
  2227. A 60 MHz PPC 601 is capable of writing into its cache RAM at 240 MB/sec.
  2228. A PowerMac 6100/60 has a memory subsystem capable of copying about
  2229. 20 MB/sec (using BlockMoveData, for instance).
  2230.  
  2231. This huge discrepency (a factor of more than 10:1) means that it virtually
  2232. doesn't matter if your program uses ten instructions where one would have
  2233. been enough -- assuming that you are wanting to zero a block of memory
  2234. that is larger than your cache.
  2235.  
  2236. Loop unrolling, pointer arithmetic, common subexpression elimination -- none
  2237. of these matter in this case.  I'm perfectly capable of using these when
  2238. they help -- and you'll often see me advocate such things here.
  2239.  
  2240. This is not one of those times.
  2241.  
  2242. What *does* help, and help more than anything you suggested, is to tell the
  2243. processor that it doesn't have to read the memory before it writes new
  2244. contents to it.  This results in an instant doubling of speed.
  2245.  
  2246. You've got to understand what's going on, not just blindly apply the same
  2247. trick in every case.
  2248.  
  2249. -- Bruce
  2250.  
  2251. ---------------------------
  2252.  
  2253. >From mhlee@hsc.usc.edu (Marianne Lee)
  2254. Subject: Inside Mac on CD-ROM
  2255. Date: 16 Sep 1994 04:58:51 -0700
  2256. Organization: University of Southern California, Los Angeles, CA
  2257.  
  2258. I want to start programming on the Mac soon and so I ordered the new
  2259. Inside Macintosh on CD-ROM.  It seems like a great deal because it has
  2260. all the info of the current Inside Macs at a fraction of the price.
  2261. One of my friends told me that with 7.5 out now, the old Inside Macs
  2262. might get out of date soon.  Is it worth it to get this CD-ROM then?
  2263.  
  2264. +++++++++++++++++++++++++++
  2265.  
  2266. >From plsuh@econ.sas.upenn.edu (Paul L. Suh)
  2267. Date: Fri, 16 Sep 1994 11:00:38 -0400
  2268. Organization: UPenn Grad Econ
  2269.  
  2270. In article <35c19r$7vt@hsc.usc.edu>, mhlee@hsc.usc.edu (Marianne Lee) wrote:
  2271.  
  2272. > I want to start programming on the Mac soon and so I ordered the new
  2273. > Inside Macintosh on CD-ROM.  It seems like a great deal because it has
  2274. > all the info of the current Inside Macs at a fraction of the price.
  2275. > One of my friends told me that with 7.5 out now, the old Inside Macs
  2276. > might get out of date soon.  Is it worth it to get this CD-ROM then?
  2277.  
  2278. Actually, the thing to do is subscribe to the APDA monthly developer
  2279. mailing.  It includes quarterly issues of Develop magazine, plus monthly
  2280. CD-ROMs.  The CD-ROMs are of 3 types: System Software, Toolkit, and
  2281. Reference Library.  They are sent out one per month on a rotating basis. 
  2282. In particular, the Ref Lib CD has the entire new IM plus all of the
  2283. current Tech Notes.  Since this is updated every three months, you'll
  2284. never have to worry about being out of date!  
  2285.  
  2286.  
  2287. --Paul
  2288.  
  2289. +++++++++++++++++++++++++++
  2290.  
  2291. >From aaron_bratcher@fpm.uchicago.edu (Aaron Bratcher)
  2292. Date: Fri, 16 Sep 1994 18:20:03 GMT
  2293. Organization: University of Chicago
  2294.  
  2295. In article <plsuh-1609941100380001@ts3-26.upenn.edu>,
  2296. plsuh@econ.sas.upenn.edu (Paul L. Suh) wrote:
  2297.  
  2298. > Actually, the thing to do is subscribe to the APDA monthly developer
  2299. > mailing.  It includes quarterly issues of Develop magazine, plus monthly
  2300. > CD-ROMs.  The CD-ROMs are of 3 types: System Software, Toolkit, and
  2301. > Reference Library.  They are sent out one per month on a rotating basis. 
  2302. > In particular, the Ref Lib CD has the entire new IM plus all of the
  2303. > current Tech Notes.  Since this is updated every three months, you'll
  2304. > never have to worry about being out of date!  
  2305. > --Paul
  2306.  
  2307. I thought it was stated on this channel that the monthly mailings were not
  2308. going to include the new IM any more.
  2309.  
  2310. -- 
  2311. Aaron L. Bratcher
  2312. University of Chicago
  2313.  
  2314. aaron_bratcher@fpm.uchicago.edu
  2315.  
  2316. +++++++++++++++++++++++++++
  2317.  
  2318. >From alyx@apple.com (alyx)
  2319. Date: Fri, 16 Sep 1994 21:03:06 GMT
  2320. Organization: Apple Computer, Inc.
  2321.  
  2322. In article <aaron_bratcher-1609941320030001@fpm-mac-17.uchicago.edu>,
  2323. aaron_bratcher@fpm.uchicago.edu (Aaron Bratcher) wrote:
  2324.  
  2325. > In article <plsuh-1609941100380001@ts3-26.upenn.edu>,
  2326. > plsuh@econ.sas.upenn.edu (Paul L. Suh) wrote:
  2327. > > Actually, the thing to do is subscribe to the APDA monthly developer
  2328. > > mailing.  [...]
  2329. > I thought it was stated on this channel that the monthly mailings were not
  2330. > going to include the new IM any more.
  2331.  
  2332. The _Developer CD Series_ will continue to include the complete IM.  The
  2333. _develop magazine Bookmark CD_ will contain a core set (Files, Memory, TB,
  2334. More TB, Imaging w/QD) and rotate through the rest a couple at a time.
  2335.  
  2336. +++++++++++++++++++++++++++
  2337.  
  2338. >From temple@itd.nrl.navy.mil (Dr. Jon Gerard Temple)
  2339. Date: 17 Sep 1994 03:49:01 GMT
  2340. Organization: Naval Research Laboratory
  2341.  
  2342. In article <alyx-1609941403050001@kip-61.apple.com>
  2343. alyx@apple.com (alyx) writes:
  2344.  
  2345. > In article <aaron_bratcher-1609941320030001@fpm-mac-17.uchicago.edu>,
  2346. > aaron_bratcher@fpm.uchicago.edu (Aaron Bratcher) wrote:
  2347. > > In article <plsuh-1609941100380001@ts3-26.upenn.edu>,
  2348. > > plsuh@econ.sas.upenn.edu (Paul L. Suh) wrote:
  2349. > > 
  2350. > > > Actually, the thing to do is subscribe to the APDA monthly developer
  2351. > > > mailing.  [...]
  2352. > > 
  2353. > > I thought it was stated on this channel that the monthly mailings were
  2354. not
  2355. > > going to include the new IM any more.
  2356. > > 
  2357. > The _Developer CD Series_ will continue to include the complete IM.  The
  2358. > _develop magazine Bookmark CD_ will contain a core set (Files, Memory, TB,
  2359. > More TB, Imaging w/QD) and rotate through the rest a couple at a time.
  2360.  
  2361.  
  2362. Folks: You can always just backorder the Develop Bookmark CD issue #17
  2363. for $13, direct from d e v e l o p. (They even have a 1-800 toll free
  2364. number :) It has the complete New Inside Mac collection on it.  I did
  2365. this and thus was not affected by Develop's decision to leave them off
  2366. of newer BookMark CDs (my subscription began with issue #18, the first
  2367. one that was affected).  The last I checked, $13 was quite a bit less
  2368. than the $99 that will be charged for the new CD.  It's a great deal!
  2369.  
  2370. +++++++++++++++++++++++++++
  2371.  
  2372. >From mhlee@hsc.usc.edu (Marianne Lee)
  2373. Date: 16 Sep 1994 22:16:11 -0700
  2374. Organization: University of Southern California, Los Angeles, CA
  2375.  
  2376. temple@itd.nrl.navy.mil (Dr. Jon Gerard Temple) writes:
  2377.  
  2378. >Folks: You can always just backorder the Develop Bookmark CD issue #17
  2379. >for $13, direct from d e v e l o p. (They even have a 1-800 toll free
  2380. >number :) It has the complete New Inside Mac collection on it.  I did
  2381. >this and thus was not affected by Develop's decision to leave them off
  2382. >of newer BookMark CDs (my subscription began with issue #18, the first
  2383. >one that was affected).  The last I checked, $13 was quite a bit less
  2384. >than the $99 that will be charged for the new CD.  It's a great deal!
  2385.  
  2386. So is there any new stuff or anything useful in the new CD?  Why would
  2387. Apple release such a thing if it were already available at $13?  Is it
  2388. purely marketing?
  2389.  
  2390. BTW, when is the next develop issue coming out?  I ordered a subscription
  2391. last month and was wondering when the I'm going to get the first one.
  2392.  
  2393. +++++++++++++++++++++++++++
  2394.  
  2395. >From neil_ticktin@xplain.com (Neil Ticktin)
  2396. Date: Sun, 18 Sep 1994 18:54:02 GMT
  2397. Organization: MacTech Magazine/Xplain Corporation
  2398.  
  2399. In article <35c19r$7vt@hsc.usc.edu>, mhlee@hsc.usc.edu (Marianne Lee) wrote:
  2400.  
  2401. >> I want to start programming on the Mac soon and so I ordered the new
  2402. >> Inside Macintosh on CD-ROM.  It seems like a great deal because it has
  2403. >> all the info of the current Inside Macs at a fraction of the price.
  2404. >> One of my friends told me that with 7.5 out now, the old Inside Macs
  2405. >> might get out of date soon.  Is it worth it to get this CD-ROM then?
  2406.  
  2407. Marianne,
  2408.  
  2409. You've gotten many positive comments on the develop Bookmark CD.  Let me
  2410. give you some other bits of information.  You can order develop and
  2411. related things through APDA. Here are some addresses and phone numbers you
  2412. may find useful:
  2413.  
  2414. To recieve an APDA catalog (development tools and documentation):
  2415.   APDA
  2416.   P.O. Box 319
  2417.   Buffalo, NY  14207-0319
  2418.   Phone: 1 800 282-2732 (U.S.A.)
  2419.          1 800 637-0029 (Canada)
  2420.          716 871-6555 (international)
  2421.          716 871-6511 (FAX)
  2422.   AppleLink: APDA
  2423.   E-Mail: apda@applelink.apple.com
  2424.   CompuServe: 76666,2405
  2425.  
  2426. In addition, there's a CD from Addison-Wesley that is shortly going to
  2427. ship (if it isn't already).  This will contain all of the New IM volumes
  2428. (as I understand it).  I believe it is priced in the $80-130 price range. 
  2429. This is a DocViewer type CD and doesn't really have searching or hypertext
  2430. capabilities.
  2431.  
  2432. Finally, there's THINK Reference by Symantec.  TR is the _old_ Inside
  2433. Macintosh Volumes 1-6.  If you are going to do "standard" Macintosh
  2434. programming and not take advantage of anything beyond the basic System 7
  2435. technologies, this will cover what you need.  The best part about TR is it
  2436. extensive hyperlinks and searching -- far better than any other solution
  2437. today.
  2438.  
  2439. If you want more info on the Bookmark CD, call APDA.  If you want more
  2440. info on the AW CD, you can get that from APDA or our mail order dept.  If
  2441. you want TR, you can get it at your local dealer, or you can buy our
  2442. MacTech CD which has TR bundled with it.  Our customer service dept can
  2443. help you with anything from our Mail Order Dept.
  2444.  
  2445. Hope it helps,
  2446.  
  2447. Neil Ticktin
  2448. MacTech Magazine
  2449.  
  2450. - ---------------------------------------------------------------------
  2451.            Neil Ticktin, MacTech Magazine (formerly MacTutor)
  2452. PO Box 250055, Los Angeles, CA 90025 * 310-575-4343 * Fax: 310-575-0925
  2453.  For more info, anonymous ftp to ftp.netcom.com and cd to /pub/xplain
  2454.   custservice@xplain.com * editorial@xplain.com * adsales@xplain.com
  2455. marketing@xplain.com * accounting@xplain.com * pressreleases@xplain.com
  2456.    progchallenge@xplain.com * publisher@xplain.com * info@xplain.com
  2457.  
  2458. +++++++++++++++++++++++++++
  2459.  
  2460. >From mhlee@hsc.usc.edu (Marianne Lee)
  2461. Date: 18 Sep 1994 11:30:50 -0700
  2462. Organization: University of Southern California, Los Angeles, CA
  2463.  
  2464. neil_ticktin@xplain.com (Neil Ticktin) writes:
  2465. >In addition, there's a CD from Addison-Wesley that is shortly going to
  2466. >ship (if it isn't already).  This will contain all of the New IM volumes
  2467. >(as I understand it).  I believe it is priced in the $80-130 price range. 
  2468. >This is a DocViewer type CD and doesn't really have searching or hypertext
  2469. >capabilities.
  2470.  
  2471. No searching or hypertext on the NIM CD?  How about the IMs on the develop
  2472. CDs, do they have any type of indexing or easy way to look up things?
  2473.  
  2474. Just a question, how many of you would prefer the NIM CD over having the
  2475. develop version?  Buying develops 17 through 19 and getting a subscription
  2476. (which I will be doing anyway) is still cheaper than one NIM CD.
  2477.  
  2478. +++++++++++++++++++++++++++
  2479.  
  2480. >From nick+@pitt.edu ( nick.c )
  2481. Date: Mon, 19 Sep 94 11:53:45 GMT
  2482. Organization: The Pitt, Chemistry
  2483.  
  2484. In Article <35i10q$s6n@hsc.usc.edu>, mhlee@hsc.usc.edu (Marianne Lee) wrote:
  2485. >neil_ticktin@xplain.com (Neil Ticktin) writes:
  2486.  
  2487. >>In addition, there's a CD from Addison-Wesley that is shortly going to
  2488. >>ship (if it isn't already).  This will contain all of the New IM volumes
  2489. >>(as I understand it).  I believe it is priced in the $80-130 price range. 
  2490. >>This is a DocViewer type CD and doesn't really have searching or hypertext
  2491. >>capabilities.
  2492. >
  2493. >No searching or hypertext on the NIM CD?  How about the IMs on the develop
  2494. >CDs, do they have any type of indexing or easy way to look up things?
  2495. >
  2496. >Just a question, how many of you would prefer the NIM CD over having the
  2497. >develop version?  Buying develops 17 through 19 and getting a subscription
  2498. >(which I will be doing anyway) is still cheaper than one NIM CD.
  2499.  
  2500.     The CD Neil mentions is starting at $99, available from 
  2501.       SoftPro at 1-617-273-2919 (it was pre-orderable from
  2502.       macworld for $80, and will eventually sell for $150).
  2503.  
  2504.     It will have indexes and searching, but nothing as exntensive
  2505.       and the Think Reference hyperlinks.  It's identical to
  2506.       those on the develop CD's.
  2507.  
  2508.     I think we'd all prefer to have as many of the NIM on one
  2509.       CD as possible.  The question is: is it worth the extra $99.
  2510.       Personally, I'm going to pass on the Addison Wesley CD,
  2511.       I already have the _develop_ CD's, but I'm sure some folks
  2512.       will find $99 worth it to have all the info on one, rather
  2513.       than 5 CD's.  Note another option is a subscription to
  2514.       the Developer mailing.  For $250, you'll get 12 disks a
  2515.       year including ones with all the NIM on one disk, and 
  2516.       System 7.5.  That alone makes it tempting, the additional
  2517.       system enhancements, reference literature, and development
  2518.       tools make it a pretty good deal.
  2519.  
  2520.                                             -- nick
  2521.  
  2522.  
  2523.  
  2524.                                     _/   _/  _/  _/_/_/   _/   _/  
  2525.      Interet: nick@pitt.edu        _/_/ _/  _/  _/   _/  _/_/_/    
  2526.       eWorld: nick                _/ _/_/  _/  _/       _/ _/      
  2527.          CIS: 71232,766          _/   _/  _/   _/_/_/  _/   _/     
  2528.  
  2529.  
  2530. +++++++++++++++++++++++++++
  2531.  
  2532. >From neil_ticktin@xplain.com (Neil Ticktin)
  2533. Date: Tue, 20 Sep 1994 03:55:10 GMT
  2534. Organization: MacTech Magazine/Xplain Corporation
  2535.  
  2536. In article <35i10q$s6n@hsc.usc.edu>, mhlee@hsc.usc.edu (Marianne Lee) wrote:
  2537.  
  2538. >> No searching or hypertext on the NIM CD?  How about the IMs on the develop
  2539. >> CDs, do they have any type of indexing or easy way to look up things?
  2540.  
  2541. Marianne,
  2542.  
  2543. I'm not 100% sure on this.  If I understood some previous comments,
  2544. there's searching within an individual document, but that's it.  There's
  2545. no real indexing or searching mechanism across documents.  Hopefully,
  2546. someone will correct me if I'm wrong -- but that's how I understand it.
  2547.  
  2548. Good luck,
  2549.  
  2550. Neil
  2551.  
  2552. - ---------------------------------------------------------------------
  2553.            Neil Ticktin, MacTech Magazine (formerly MacTutor)
  2554. PO Box 250055, Los Angeles, CA 90025 * 310-575-4343 * Fax: 310-575-0925
  2555.  For more info, anonymous ftp to ftp.netcom.com and cd to /pub/xplain
  2556.   custservice@xplain.com * editorial@xplain.com * adsales@xplain.com
  2557. marketing@xplain.com * accounting@xplain.com * pressreleases@xplain.com
  2558.    progchallenge@xplain.com * publisher@xplain.com * info@xplain.com
  2559.  
  2560. +++++++++++++++++++++++++++
  2561.  
  2562. >From dkj@apple.com (Dave Johnson)
  2563. Date: Tue, 20 Sep 1994 22:07:33 GMT
  2564. Organization: Apple Computer
  2565.  
  2566. In article <neil_ticktin-1909941955100001@xplain.slip.netcom.com>,
  2567. neil_ticktin@xplain.com (Neil Ticktin) wrote:
  2568.  
  2569. > I'm not 100% sure on this.  If I understood some previous comments,
  2570. > there's searching within an individual document, but that's it.  There's
  2571. > no real indexing or searching mechanism across documents.  Hopefully,
  2572. > someone will correct me if I'm wrong -- but that's how I understand it.
  2573.  
  2574. Since the books are all in DoicViewer format, there is good searching
  2575. within and across all the books. Using the collections feature in
  2576. Docviewer in combination with the query command can be very powerful. Any
  2577. DocViewer users out there who don't know about collections and/or Query
  2578. should check it (them) out.
  2579.  
  2580. Of course, this is true for ANY set of DocViewer documents, not just the NIM
  2581. CD.
  2582.  
  2583. Dave Johnson
  2584.  
  2585. +++++++++++++++++++++++++++
  2586.  
  2587. >From hrody@ingr.com (H. M. Rody)
  2588. Date: Wed, 21 Sep 1994 07:51:08 -0500
  2589. Organization: Intergraph Corporation
  2590.  
  2591. In article <neil_ticktin-1909941955100001@xplain.slip.netcom.com>,
  2592. neil_ticktin@xplain.com (Neil Ticktin) wrote:
  2593.  
  2594. > In article <35i10q$s6n@hsc.usc.edu>, mhlee@hsc.usc.edu (Marianne Lee)
  2595. wrote:
  2596. > >> No searching or hypertext on the NIM CD?  How about the IMs on the
  2597. develop
  2598. > >> CDs, do they have any type of indexing or easy way to look up things?
  2599. > Marianne,
  2600. > I'm not 100% sure on this.  If I understood some previous comments,
  2601. > there's searching within an individual document, but that's it.  There's
  2602. > no real indexing or searching mechanism across documents.  Hopefully,
  2603. > someone will correct me if I'm wrong -- but that's how I understand it.
  2604.  
  2605. I too believe that this is true.  I am currently programming on NT and Mac
  2606. and I have found that the the layout of the Microsoft CDs as far as search
  2607. is far better that on the Developer CDs.  The search engines on the 
  2608. Microsoft CDs can search the whole CD or parts.  This is an area that
  2609. Apple can definately improve on.
  2610.  
  2611. What about integrating Apple Search into their own CD?  Apple Search looks
  2612. like an excellent product.
  2613.  
  2614. -- 
  2615. - ----------------------------------------------------------------------
  2616. Marshall Rody                            | Intergraph Corporation
  2617. UUCP:     ...uunet!ingr!infonode!hrody   | One Madison Industrial Park
  2618. INTERNET: hrody@ingr.com                 | Mail Stop GD3002
  2619. AT&T:     (205) 730-3748                 | Huntsville, AL  35807-4201
  2620.  
  2621. +++++++++++++++++++++++++++
  2622.  
  2623. >From alyx@apple.com (alyx)
  2624. Date: Wed, 21 Sep 1994 17:15:51 GMT
  2625. Organization: Apple Computer, Inc.
  2626.  
  2627. In article <neil_ticktin-1809941054020001@xplain.slip.netcom.com>,
  2628. the usually better-informed neil_ticktin@xplain.com (Neil Ticktin) wrote:
  2629.  
  2630. > This is a DocViewer type CD and doesn't really have searching [...]
  2631. > capabilities.
  2632.  
  2633. oh, please.  it's called "Query".  RTFM!!
  2634.  
  2635. +++++++++++++++++++++++++++
  2636.  
  2637. >From doumakes@netcom.com (Don Doumakes)
  2638. Date: Mon, 26 Sep 1994 16:41:00 GMT
  2639. Organization: NETCOM On-line Communication Services (408 261-4700 guest)
  2640.  
  2641. Sorry for the repetition, folks.  Problem with my offline reader.
  2642.  
  2643. --
  2644. ______________________________________________________________________
  2645. Don Doumakes                                       doumakes@netcom.com
  2646.  
  2647. ---------------------------
  2648.  
  2649. >From bb@lightside.com (Bob Bradley)
  2650. Subject: Q: Using PPC apps without Shared Libraries?
  2651. Date: Mon, 26 Sep 1994 15:00:39 -0800
  2652. Organization: SS Software Inc.
  2653.  
  2654. I noticed that every application that uses a shared library (including my
  2655. own) will not launch if that shared library cannot be found. Is there any
  2656. way around this?
  2657.  
  2658. I'm using the Thread Manager on a PowerPC in my application and have the
  2659. appropriate checks in my application to tell whether or not the Thread
  2660. Manager is available and if not, it uses non-Thread Manager code to still
  2661. function (it is limited if not using the Thread Manager). The problem is
  2662. my code never gets a chance to run since the system says it couldn't find
  2663. the ThreadsLib (when the extension isn't loaded). 
  2664.  
  2665. The System doesn't appear to be very thorough in it's search for the
  2666. library either since another application that requires QuickTime wouldn't
  2667. run even when QuickTime was installed. I tried copying the QuickTimeLib 
  2668. and it still didn't work until I re-installed QuickTime.
  2669.  
  2670. +++++++++++++++++++++++++++
  2671.  
  2672. >From jwbaxter@olympus.net (John W. Baxter)
  2673. Date: Wed, 28 Sep 1994 07:49:01 -0700
  2674. Organization: Internet for the Olympic Peninsula
  2675.  
  2676. In article <bb-2609941500390001@user48.lightside.com>, bb@lightside.com
  2677. (Bob Bradley) wrote:
  2678.  
  2679. > I noticed that every application that uses a shared library (including my
  2680. > own) will not launch if that shared library cannot be found. Is there any
  2681. > way around this?
  2682. > I'm using the Thread Manager on a PowerPC in my application and have the
  2683. > appropriate checks in my application to tell whether or not the Thread
  2684. > Manager is available and if not, it uses non-Thread Manager code to still
  2685. > function (it is limited if not using the Thread Manager). The problem is
  2686. > my code never gets a chance to run since the system says it couldn't find
  2687. > the ThreadsLib (when the extension isn't loaded). 
  2688. > The System doesn't appear to be very thorough in it's search for the
  2689. > library either since another application that requires QuickTime wouldn't
  2690. > run even when QuickTime was installed. I tried copying the QuickTimeLib 
  2691. > and it still didn't work until I re-installed QuickTime.
  2692.  
  2693. There are two ways to link code which uses routines from a PPC shared
  2694. library.  One is as you describe (a "hard" link), and the Code Fragment
  2695. Manager refuses to proceed if a library so linked is not present at the
  2696. time the fragment is prepared.  The other is the "soft" link...in this
  2697. case the absence of a needed library causes references into that library
  2698. to be resolved by CFM into a magic value which will cause an error when
  2699. the reference is later used.  It is then up to the using code to protect
  2700. itself before using such a reference.
  2701.  
  2702. See Inside Mac: Power PC System Software.
  2703.  
  2704. There is a case you need to protect against, which means that with most
  2705. shared libraries, merely checking Gestalt is not safe enough.  Suppose the
  2706. needed library is present at startup time.  The Gestalt selector gets set
  2707. up on that basis.  The user drags the Shared Library out of the Extensions
  2708. folder and then starts your app.  CFM sees the absence of the library, and
  2709. does its magic value thing.  In many cases though, your app's check of
  2710. Gestalt suggests that the library is present because the feature it
  2711. implements is available.
  2712.  
  2713. HOW you do a soft link depends on which development environment you use. 
  2714. MPW and CodeWarrior can do it.  --John
  2715.  
  2716. -- 
  2717. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  2718.    "Occasionally...astronomers add a second to either June 31 or
  2719.     December 31..."   IM: OS Utilities, p 4-12
  2720.    jwbaxter@pt.olympus.net
  2721.  
  2722. +++++++++++++++++++++++++++
  2723.  
  2724. >From h+@nada.kth.se (Jon W{tte)
  2725. Date: Wed, 28 Sep 1994 15:40:30 +0100
  2726. Organization: Royal Institute of Something or other
  2727.  
  2728. In article <bb-2609941500390001@user48.lightside.com>,
  2729. bb@lightside.com (Bob Bradley) wrote:
  2730.  
  2731. >I noticed that every application that uses a shared library (including my
  2732. >own) will not launch if that shared library cannot be found. Is there any
  2733. >way around this?
  2734.  
  2735. Yes:
  2736.  
  2737. 1) Indlude the shared library with your application
  2738.  
  2739. or
  2740.  
  2741. 2) Import the library "weakly" - in CodeWarrior, it's a flag in 
  2742. the project window popup menu for the file.
  2743.  
  2744. The search path for a shared library is:
  2745.  
  2746. * In the Applications' folder
  2747. * In the Extensions folder
  2748.  
  2749. That's it.
  2750.  
  2751.  
  2752. --
  2753.   Jon W$E4tte (h+@nada.kth.se), Hagagatan 1, 113 48 Stockholm, Sweden
  2754.  "Don't use the Layer Manager"
  2755.  
  2756.  
  2757. +++++++++++++++++++++++++++
  2758.  
  2759. >From willie-abrams@uokhsc.edu (Willie Abrams)
  2760. Date: Wed, 28 Sep 1994 14:58:27 -0500
  2761. Organization: OUHSC Center for Telemedicine
  2762.  
  2763. In article <bb-2609941500390001@user48.lightside.com>, bb@lightside.com
  2764. (Bob Bradley) wrote:
  2765.  
  2766. > I noticed that every application that uses a shared library (including my
  2767. > own) will not launch if that shared library cannot be found. Is there any
  2768. > way around this?
  2769. > I'm using the Thread Manager on a PowerPC in my application and have the
  2770. > appropriate checks in my application to tell whether or not the Thread
  2771. > Manager is available and if not, it uses non-Thread Manager code to still
  2772. > function (it is limited if not using the Thread Manager). The problem is
  2773. > my code never gets a chance to run since the system says it couldn't find
  2774. > the ThreadsLib (when the extension isn't loaded). 
  2775. > The System doesn't appear to be very thorough in it's search for the
  2776. > library either since another application that requires QuickTime wouldn't
  2777. > run even when QuickTime was installed. I tried copying the QuickTimeLib 
  2778. > and it still didn't work until I re-installed QuickTime.
  2779.  
  2780. Import "weak" (if you are using CodeWarrior, that option is in the little
  2781. triangle thingy next to the library) the shared libraries that you are
  2782. using, and then check for their presence before calling the routines.
  2783.  
  2784. -- 
  2785. Willie Abrams
  2786. willie-abrams@uokhsc.edu
  2787.  
  2788. Less is more. God is in the details. - Mies van der Rohe
  2789.  
  2790. +++++++++++++++++++++++++++
  2791.  
  2792. >From isis@netcom.com (Mike Cohen)
  2793. Date: Thu, 29 Sep 1994 18:01:12 GMT
  2794. Organization: ISIS International
  2795.  
  2796. bb@lightside.com (Bob Bradley) writes:
  2797.  
  2798. >I noticed that every application that uses a shared library (including my
  2799. >own) will not launch if that shared library cannot be found. Is there any
  2800. >way around this?
  2801.  
  2802. >I'm using the Thread Manager on a PowerPC in my application and have the
  2803. >appropriate checks in my application to tell whether or not the Thread
  2804. >Manager is available and if not, it uses non-Thread Manager code to still
  2805. >function (it is limited if not using the Thread Manager). The problem is
  2806. >my code never gets a chance to run since the system says it couldn't find
  2807. >the ThreadsLib (when the extension isn't loaded). 
  2808.  
  2809. If you're using MetroWerks, click on the popup next to the library and
  2810. select "soft import". If you do this, make sure you check that the functions
  2811. in it actually exist before calling them (you could probably test only one
  2812. function at startup). To do it, write something like:
  2813.  
  2814.     if (someFunction != NULL)
  2815.         someFunction();
  2816. -- 
  2817. Mike Cohen - isis@netcom.com
  2818. NewtonMail, eWorld: MikeC / ALink: D6734 / AOL: MikeC20
  2819. Home Page: file://ftp.netcom.com/pub/isis/home.html
  2820.  
  2821. +++++++++++++++++++++++++++
  2822.  
  2823. >From Jens Alfke <jens_alfke@powertalk.apple.com>
  2824. Date: Fri, 30 Sep 1994 18:25:32 GMT
  2825. Organization: Apple Computer
  2826.  
  2827. Jon W{tte, h+@nada.kth.se writes:
  2828. > The search path for a shared library is:
  2829. > * In the Applications' folder
  2830. > * In the Extensions folder
  2831.  
  2832. You forgot:
  2833. * In any folder inside the Extensions folder (including aliases to folders.)
  2834.  
  2835. --Jens Alfke                           jens_alfke@powertalk.apple.com
  2836.                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  2837.  
  2838. +++++++++++++++++++++++++++
  2839.  
  2840. >From 103t_english@west.cscwc.pima.edu
  2841. Date: 30 Sep 94 13:08:43 MST
  2842. Organization: (none)
  2843.  
  2844. In article <1994Sep30.182532.29882@gallant.apple.com>, Jens Alfke
  2845. <jens_alfke@powertalk.apple.com> writes:
  2846. > Jon W{tte, h+@nada.kth.se writes:
  2847. >> The search path for a shared library is:
  2848. >> 
  2849. >> * In the Applications' folder
  2850. >> * In the Extensions folder
  2851. > You forgot:
  2852. > * In any folder inside the Extensions folder (including aliases to
  2853. folders.)
  2854. > --Jens Alfke                           jens_alfke@powertalk.apple.com
  2855. >                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  2856.  
  2857. OW! There goes the trick of putting inactive extesions in the "Inactive
  2858. Extensions Folder"...
  2859.  
  2860.  
  2861. Lawson
  2862.  
  2863. +++++++++++++++++++++++++++
  2864.  
  2865. >From greg@math.harvard.edu (Gregory D. Landweber)
  2866. Date: 30 Sep 94 20:21:23 EDT
  2867. Organization: Dept. of Math, Harvard Univ.
  2868.  
  2869. In article <bb-2609941500390001@user48.lightside.com> bb@lightside.com (Bob
  2870. Bradley) writes:
  2871. >I noticed that every application that uses a shared library (including my
  2872. >own) will not launch if that shared library cannot be found. Is there any
  2873. >way around this?
  2874.  
  2875. You need to mark the library as "weak", in which case the system will not
  2876. require that it be linked in when the application is launched.  You can
  2877. designate the library as "weak" in the CodeWarrior project window (using
  2878. the tiny pop up to the right of the library name).  Of course, if you do
  2879. so, you'll have to check to make sure that the routines are present before
  2880. you call them.  Checking the appropriate Gestalt selectors should be good
  2881. enough, but you can double check that a pointer to the routine isn't null
  2882.  
  2883. -- Greg
  2884.    greg@math.harvard.edu
  2885.  
  2886. +++++++++++++++++++++++++++
  2887.  
  2888. >From jwbaxter@olympus.net (John W. Baxter)
  2889. Date: Fri, 30 Sep 1994 21:04:59 -0700
  2890. Organization: Internet for the Olympic Peninsula
  2891.  
  2892. In article <1994Sep30.130843@west.cscwc.pima.edu>,
  2893. 103t_english@west.cscwc.pima.edu wrote:
  2894.  
  2895. > In article <1994Sep30.182532.29882@gallant.apple.com>, Jens Alfke
  2896. <jens_alfke@powertalk.apple.com> writes:
  2897. > > Jon W{tte, h+@nada.kth.se writes:
  2898. > >> The search path for a shared library is:
  2899. > >> 
  2900. > >> * In the Applications' folder
  2901. > >> * In the Extensions folder
  2902. > > 
  2903. > > You forgot:
  2904. > > * In any folder inside the Extensions folder (including aliases to
  2905. folders.)
  2906. > > 
  2907. > > --Jens Alfke                           jens_alfke@powertalk.apple.com
  2908. > >                    "A man, a plan, a yam, a can of Spam ... Bananama!"
  2909. > OW! There goes the trick of putting inactive extesions in the "Inactive
  2910. > Extensions Folder"...
  2911.  
  2912. No...just put that folder "beside" the Extensions folder, not inside it. 
  2913. [Or use Extension Manager, which does that using " disabled" as a
  2914. suffix.]  I usually drag things between the real and the corresponding
  2915. (disabled) folders, rather than bothering with Extension Manager.  For
  2916. things I toggle a lot, I write a (Frontier, but AppleScript will do)
  2917. script.
  2918.  
  2919.    --John
  2920.  
  2921. -- 
  2922. John Baxter    Port Ludlow, WA, USA  [West shore, Puget Sound]
  2923.    Sorry...clever signatures require cleverness, not found here.
  2924.    jwbaxter@pt.olympus.net
  2925.  
  2926. ---------------------------
  2927.  
  2928. >From peter.lewis@info.curtin.edu.au (Peter N Lewis)
  2929. Subject: Reading STR# resource - Pascal code
  2930. Date: Thu, 29 Sep 1994 12:25:30 +0800
  2931. Organization: NCRPDA, Curtin University
  2932.  
  2933. >epenneba@ux1.cso.uiuc.edu (Erik Pennebaker ) wrote:
  2934. >
  2935. > ) This is probably a relatively lightweight quesiton, but I couldn't get
  2936. > ) a straight answer (or couldn't find a straight answer) from Inside Mac.
  2937. > ) I'm writing a program that needs to read strings from STR# resource, 
  2938. > ) and needs to know how many strings are in this. I've seen this done, 
  2939. > ) but for some reason mine seemed to read a null string.  If anyoone
  2940. > ) could write an quick example of this it would be great....:)
  2941.  
  2942. Here is some Pascal code to create, modify, read, and write STR# resources
  2943. and handles.
  2944.    Peter.
  2945.  
  2946. unit MyStrH;
  2947.  
  2948. interface
  2949.  
  2950. {$IFC undefined THINK_Pascal}
  2951.    uses
  2952.       Types;
  2953. {$ENDC}
  2954.  
  2955.    type
  2956.       lineIndex = integer;
  2957.  
  2958.    function NewStrH: handle;
  2959.    procedure ReinitStrH (h: handle);
  2960.    function CountStrs (id: integer): lineIndex;
  2961.    function CountStrsH (h: handle): lineIndex;
  2962.    function GetIndStr (id: integer; index: lineIndex): str255;
  2963.    function GetIndStrH (h: handle; index: lineIndex): str255;
  2964.    procedure SetIndStr (id, index: lineIndex; s: str255);
  2965.    procedure SetIndStrH (h: handle; index: lineIndex; s: str255);
  2966.    procedure DelIndStr (id: integer; index: lineIndex);
  2967.    procedure DelIndStrH (h: handle; index: lineIndex);
  2968.    procedure InsIndString (id: integer; index: lineIndex; s: str255);
  2969.    procedure InsIndStrH (h: handle; index: integer; s: str255);
  2970.  
  2971. implementation
  2972.  
  2973. {$IFC undefined THINK_Pascal}
  2974.    uses
  2975.       Memory, Resources, ToolUtils;
  2976. {$ENDC}
  2977.  
  2978.    type
  2979.       indexPtr = ^lineIndex;
  2980.       indexHandle = ^indexPtr;
  2981.  
  2982.    function NewStrH: handle;
  2983.    begin
  2984.       NewStrH := NewHandleClear(SizeOf(lineIndex));
  2985.    end;
  2986.  
  2987.    procedure ReinitStrH (h: handle);
  2988.    begin
  2989.       SetHandleSize(h, SizeOf(lineIndex));
  2990.       indexHandle(h)^^ := 0;
  2991.    end;
  2992.  
  2993.    function CountStrsH (h: handle): integer;
  2994.    begin
  2995.       CountStrsH := indexHandle(h)^^;
  2996.    end;
  2997.  
  2998.    function CountStrs (id: integer): lineIndex;
  2999.       var
  3000.          h: handle;
  3001.    begin
  3002.       h := GetResource('STR#', id);
  3003.       CountStrs := indexHandle(h)^^;
  3004.    end;
  3005.  
  3006.    function GetIndStr (id: integer; index: lineIndex): str255;
  3007.       var
  3008.          s: str255;
  3009.    begin
  3010.       GetIndString(s, id, index);
  3011.       GetIndStr := s;
  3012.    end;
  3013.  
  3014.    function GetIndStrH (h: handle; index: lineIndex): str255;
  3015.       var
  3016.          count, i: lineIndex;
  3017.          s: str255;
  3018.          ps: longInt;
  3019.    begin
  3020.       count := indexHandle(h)^^;
  3021.       if (1 <= index) and (index <= count) then begin
  3022.          ps := SizeOf(lineIndex);
  3023.          for i := 1 to index - 1 do
  3024.             ps := ps + BAND(ptr(ord(h^) + ps)^, $FF) + 1;
  3025.          BlockMove(ptr(ord(h^) + ps), @s, BAND(ptr(ord(h^) + ps)^, $FF) + 1);
  3026.       end
  3027.       else
  3028.          s := '';
  3029.       GetIndStrH := s;
  3030.    end;
  3031.  
  3032.    procedure SetIndStrH (h: handle; index: lineIndex; s: str255);
  3033.       var
  3034.          count, i: lineIndex;
  3035.          sz: longInt;
  3036.          p: longInt;
  3037.          err: longInt;
  3038.          ps: longInt;
  3039.    begin
  3040.       count := indexHandle(h)^^;
  3041.       sz := GetHandleSize(h);
  3042.       if count < index then begin
  3043.          SetHandleSize(h, sz + index - count);
  3044.          for p := ord(h^) + sz to ord(h^) + sz + index - count - 1 do
  3045.             ptr(p)^ := 0;
  3046.          indexHandle(h)^^ := index;
  3047.          count := index;
  3048.       end;
  3049.       ps := SizeOf(lineIndex);
  3050.       for i := 1 to index - 1 do
  3051.          ps := ps + BAND(ptr(ord(h^) + ps)^, $FF) + 1;
  3052.       err := Munger(h, ps, nil, BAND(ptr(ord(h^) + ps)^, $FF) + 1, @s,
  3053. length(s) + 1);
  3054.    end;
  3055.  
  3056.    procedure SetIndStr (id, index: lineIndex; s: str255);
  3057.       var
  3058.          h: handle;
  3059.    begin
  3060.       h := GetResource('STR#', id);
  3061.       HNoPurge(h);
  3062.       SetIndStrH(h, index, s);
  3063.       HPurge(h);
  3064.       ChangedResource(h);
  3065.       WriteResource(h);
  3066.    end;
  3067.  
  3068.    procedure DelIndStrH (h: handle; index: integer);
  3069.       var
  3070.          count, i: lineIndex;
  3071.          sz: longInt;
  3072.          err: longInt;
  3073.          ps: longInt;
  3074.    begin
  3075.       count := indexHandle(h)^^;
  3076.       sz := GetHandleSize(h);
  3077.       if count >= index then begin
  3078.          ps := SizeOf(lineIndex);
  3079.          for i := 1 to index - 1 do
  3080.             ps := ps + BAND(ptr(ord(h^) + ps)^, $FF) + 1;
  3081.          err := Munger(h, ps, nil, BAND(ptr(ord(h^) + ps)^, $FF) + 1,
  3082. @err, 0); { @err is a safe, non nil addr }
  3083.          indexHandle(h)^^ := count - 1;
  3084.       end;
  3085.    end;
  3086.  
  3087.    procedure DelIndStr (id: integer; index: lineIndex);
  3088.       var
  3089.          h: handle;
  3090.    begin
  3091.       h := GetResource('STR#', id);
  3092.       HNoPurge(h);
  3093.       DelIndStrH(h, index);
  3094.       HPurge(h);
  3095.       ChangedResource(h);
  3096.       WriteResource(h);
  3097.    end;
  3098.  
  3099.    procedure InsIndStrH (h: handle; index: integer; s: str255);
  3100.       var
  3101.          count, i: lineIndex;
  3102.          err: longInt;
  3103.          ps: longInt;
  3104.          t: string[2];
  3105.    begin
  3106.       count := indexHandle(h)^^;
  3107.       if count >= index then begin
  3108.          ps := SizeOf(lineIndex);
  3109.          for i := 1 to index - 1 do
  3110.             ps := ps + BAND(ptr(ord(h^) + ps)^, $FF) + 1;
  3111.          t := '';
  3112.          err := Munger(h, ps, nil, 0, @t, length(t) + 1);
  3113.          indexHandle(h)^^ := count + 1;
  3114.       end;
  3115.       SetIndStrH(h, index, s)
  3116.    end;
  3117.  
  3118.    procedure InsIndString (id: integer; index: lineIndex; s: str255);
  3119.       var
  3120.          h: handle;
  3121.    begin
  3122.       h := GetResource('STR#', id);
  3123.       HNoPurge(h);
  3124.       InsIndStrH(h, index, s);
  3125.       HPurge(h);
  3126.       ChangedResource(h);
  3127.       WriteResource(h);
  3128.    end;
  3129.  
  3130. end.
  3131. -- 
  3132. Peter N Lewis <peter.lewis@info.curtin.edu.au> - Macintosh TCP fingerpainter
  3133. FTP my programs from redback.cs.uwa.edu.au:Others/PeterLewis/ or
  3134. amug.org:pub/peterlewis/ or nic.switch.ch:software/mac/peterlewis/
  3135.  
  3136. ---------------------------
  3137.  
  3138. End of C.S.M.P. Digest
  3139. **********************
  3140.  
  3141.  
  3142. ---------------------------------------------------------------------
  3143.  
  3144. NOTE:  The following Macintosh file(s) are enclosed with this
  3145. message, in BinHex format.  If your mail system does not convert
  3146. BinHex files automatically, you will need to transfer the message to
  3147. a Mac and run the BinHex application to decode it.
  3148.  
  3149. Filename: Zero32Bytes.s.o    Size:  455 bytes
  3150.  
  3151. ---------------------------------------------------------------------
  3152.  
  3153. (This file must be converted with BinHex 4.0)
  3154.  
  3155.  
  3156.